AcquireTokenSilent immer Versagt zu erwerben token leise
Verwendung von ADAL ich habe zwei AuthenticationContext
mit einem Token-Cache persistiert in SQL.
Mit AcquireTokenByAuthorizationCode
schreibt er das Token in der Datenbank, aber bei der Verwendung von AcquireTokenSilent
ich bekomme immer
Fehlgeschlagen zu erwerben token leise. Call method AcquireToken
Hier sind die details für die Replikation das Problem:
Ich einen Kontext schaffen, in
AuthenticationContext authContext = new AuthenticationContext(_authority, new AzureAdalCache(companyId, _entries, _unitOfWork));
Dann Habe Ich AcquireToken Von Der Autorisierung
authContext.AcquireTokenByAuthorizationCode(authorizationCode, new Uri(redirectUri), _clientCredential);
Zu diesem Zeitpunkt speichert ein Eintrag in der Datenbank
Dann wenn ich den Anruf das ich eine Ausnahme.
authContext.AcquireTokenSilent(_authority, _clientCredential, new UserIdentifier(companyId.ToString(), UserIdentifierType.UniqueId)).AccessToken;
Ich habe auch versucht mit dem gleichen Ergebnis:
authContext.AcquireTokenSilent(_authority, _clientId).AccessToken;
authContext.AcquireTokenSilent(_authority, _clientCredential, UserIdentifier.AnyUser).AccessToken;
Poste ich mein AzureAdalCache
Umsetzung in diese Gist.
Jeder Eintrag der Cache ist wie diese.
Was Bin ich?
Update
Basiert auf Antworten von Kommentaren von @vibronet ich habe diese
AuthenticationContext authContext = new AuthenticationContext(_authority, new AzureAdalCache(companyId, _entries, _unitOfWork));
authContext.AcquireTokenByAuthorizationCode(authorizationCode, new Uri(redirectUri), _clientCredential, _eWSResource);
string result = authContext.AcquireTokenSilent(_eWSResource, _clientId, UserIdentifier.AnyUser).AccessToken;
InformationsquelleAutor Ricardo Polo | 2015-04-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Problem war, dass im Grunde genommen war ich mit Gemeinsamen Behörde
https://login.windows.net/common/oauth2/authorize
in meiner App. Es funktioniert für AcquireTokenByAuthorizationCode (), aber nicht für AcquireTokenSilent().So, ich brauchte es, um das TenantId, wenn der Anruf AcquireTokenByAuthorizationCode() und eine Behörde eine Behörde wie
https://login.windows.net/<tenant ID>/oauth2/authorize
wenn der Anruf AcquireTokenSilent(). Dieser Weg der gleiche code oben funktioniert.alle Beispiel-code würde helfen. da AcquireTokenByAuthorizationCodeAsync werden unterschiedliche Parameter haben.
Für mich war genug, um einfach stick in die Behörde, die url wie folgt:
https://login.windows.net/<tenant ID>/
InformationsquelleAutor Ricardo Polo
Ich verstehe nicht, die rufen:
Den UserIdentifier muss mit dem Wert im Zwischenspeicher, und CompanyID klingt nicht wie eine der Bezeichner, den Sie wieder für die token.
Bitte werfen Sie einen Blick auf die Probe, und ich zeigte Sie auf den anderen thread, und speziell auf den verwendeten Bezeichner in den Aufruf AcquireTokenSilent in https://github.com/AzureADSamples/WebApp-WebAPI-OpenIDConnect-DotNet/blob/master/TodoListWebApp/Controllers/TodoListController.cs
Sie nicht bekommen, zu wählen, welche Bezeichner zu verwenden, die anrufen, das ist bestimmt was Ansprüche AAD Probleme. Die nur die Bezeichner, die Sie wählen können, sind Sie in der cache-Instanz-Ebene, nicht in der einzelnen AcquireToken* Anrufe.
Speichern Sie er richtige Wert irgendwo und es weitergeben 🙂 oder Sie müssen über eine web-API, wenn Sie wollen, um die trigger-Logik auf Nachfrage
Aber... wie bekomme ich den Anspruch in der Website, wenn ich nicht über Azure-Authentifizierung in meine Website? Ich meine, die Benutzer der website sind lokal für die app (mit ASP.NET Identität EntityFramework). Ich bin so dass der Benutzer zur Registrierung seiner azure AD für einige hintergrund-job, aber ich nicht ändern Sie die Authentifizierung und Ansprüche an der website. So eine Idee über was sollte ich den pass als UserId für AcquireTokenSilent()?
Sie sind derjenige, der entscheidet, was ist der Kontext. Wenn Sie einen Benutzer-Sitzung mit einem lokalen Konto können Sie erstellen Sie eine ADAL cache-Instanz nur für das lokale Konto. An diesem Punkt, den Sie nicht selbst benötigen, geben Sie einen useridentifier, wenn Sie anrufen acquiretokensilent gegeben, dass es keine Mehrdeutigkeit. Das ist wirklich, wie der cache in unserem Beispiel implementiert ist
Wie ich schon in dem post habe ich es schon versucht, mit dem gleichen Ergebnis. Ich nenne authContext.AcquireTokenByAuthorizationCode(authorizationCode, new Uri(redirectUri), _clientCredential, _eWSResource); Und dann authContext.AcquireTokenSilent(_eWSResource, _clientId); Es fehl zu sagen, dass ich rufen soll, AcquireToken(). Ich bin nicht übergeben, userId, aber der TokenCache erhält "Benutzer-Id" als parameter.
InformationsquelleAutor vibronet
Prüfen, ob token ist in bestehende cache-sonst melden Sie sich und Fragen Sie den Benutzer, um sich anzumelden.
InformationsquelleAutor Kurkula
Ich hatte das gleiche Problem in ASPNetCore (1.0) und der Grund war, dass ich nicht die Speicherung des Authentifizierungs-token nach der Anmeldung. Ich löste es durch hinzufügen
OnAuthorizationCodeReceived
in der Startup-Klasse und die änderung meiner Antwort ype zuResponseType = OpenIdConnectResponseType.CodeIdToken
.Hoffe, es hilft.
Beispiel:
https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect-aspnetcore/blob/aspnet10/WebApp-WebAPI-OpenIdConnect-DotNet/Startup.cs#L100
Fixed it @KevinR.
InformationsquelleAutor teocomi
Dies ist eine alte Frage - aber für mich, ich brauchte, um zu löschen, cookies auf dem client und dann gezwungen den browser zu re-auth und alles war wieder gut.
InformationsquelleAutor ScottFoster1000