webentwicklung-frage-antwort-db.com.de

AcquireTokenSilent Der Token konnte nicht unbeaufsichtigt erworben werden

Verwenden von ADAL Ich habe zwei AuthenticationContext, die einen Token-Cache in SQL verwenden.

Mit AcquireTokenByAuthorizationCode schreibt er das Token in die Datenbank, aber mit AcquireTokenSilent bekomme ich immer etwas

Der Token konnte nicht automatisch erworben werden. Rufen Sie die Methode AcquireToken auf

Hier sind die Details für die Replikation des Problems:

Ich erstelle einen Kontext

AuthenticationContext authContext = new AuthenticationContext(_authority, new AzureAdalCache(companyId, _entries, _unitOfWork));

Dann erwerbe ich Token durch Autorisierung

authContext.AcquireTokenByAuthorizationCode(authorizationCode, new Uri(redirectUri), _clientCredential);

An dieser Stelle wird ein Eintrag in der Datenbank gespeichert

Wenn ich das anrufe, bekomme ich eine Ausnahme.

authContext.AcquireTokenSilent(_authority, _clientCredential, new UserIdentifier(companyId.ToString(), UserIdentifierType.UniqueId)).AccessToken;

Ich habe auch mit dem gleichen Ergebnis versucht:

authContext.AcquireTokenSilent(_authority, _clientId).AccessToken;
authContext.AcquireTokenSilent(_authority, _clientCredential, UserIdentifier.AnyUser).AccessToken;

Ich poste meine AzureAdalCache Implementierung in this Gist .

Jeder Eintrag des Caches ist so .

Was vermisse ich?

Update

Basierend auf der Antwort von Kommentaren von @vibronet habe ich dies

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;
14
Ricardo Polo

Das Problem war, dass ich im Allgemeinen Common Authority https://login.windows.net/common/oauth2/authorize in meiner App verwendete. Es funktioniert für AcquireTokenByAuthorizationCode (), jedoch nicht für AcquireTokenSilent ().

Ich brauchte es also, um die TenantId zu speichern, wenn AcquireTokenByAuthorizationCode () aufgerufen wird und eine Behörde eine Autorität wie https://login.windows.net/<tenant ID>/oauth2/authorizewird, wenn AcquireTokenSilent () aufgerufen wird. Auf diese Weise funktioniert derselbe Code oben.

8
Ricardo Polo

Ich verstehe den Anruf nicht:

authContext.AcquireTokenSilent(
    _authority,
    _clientCredential,
    new UserIdentifier(companyId.ToString(), UserIdentifierType.UniqueId)
).AccessToken;

Der UserIdentifier muss mit dem Wert im Cache übereinstimmen, und CompanyID klingt nicht wie die ID, die Sie für das Token erhalten.

Schauen Sie sich das Beispiel an, auf das ich Sie im anderen Thread hingewiesen habe, und insbesondere auf die Kennung, die beim Aufruf von AcquireTokenSilent in https://github.com/AzureADSamples/WebApp-WebAPI-OpenIDConnect-DotNet/blob/master verwendet wird /TodoListWebApp/Controllers/TodoListController.cs

Sie können nicht auswählen, welche Kennung in diesem Anruf verwendet werden soll. Dies hängt davon ab, welche Ansprüche AAD geltend macht. Die einzigen Bezeichner, die Sie auswählen können, sind auf der Ebene der Cache-Instanz, nicht in einzelnen AcquireToken * -Aufrufen.

4
vibronet

Prüfen Sie, ob das Token im Cache vorhanden ist. Andernfalls melden Sie sich ab und bitten den Benutzer, sich anzumelden.

AuthenticationContext authContext = new AuthenticationContext(Startup.Authority,
                        new NaiveSessionCache(userObjectID));
                    if (authContext.TokenCache.Count == 0)
                    {
                        authContext.TokenCache.Clear();
                        CosmosInterface.Utils.AuthenticationHelper.token = null;
                        HttpContext.GetOwinContext().Authentication.SignOut(
                            OpenIdConnectAuthenticationDefaults.AuthenticationType,
                            CookieAuthenticationDefaults.AuthenticationType);
                    }
1
Kurkula

Ich hatte das gleiche Problem in ASPNetCore (1.0) und der Grund dafür war, dass ich das Authentifizierungstoken nach dem Anmelden nicht gespeichert hatte. Ich habe es gelöst, indem ich OnAuthorizationCodeReceived in der Startup-Klasse hinzugefügt und mein Antwort-ype in ResponseType = OpenIdConnectResponseType.CodeIdToken geändert habe.

Ich 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

1
teocomi

Dies ist eine alte Frage - aber für mich musste ich meine Cookies auf dem Client löschen, und dann musste der Browser erneut authentifizieren, und alles war wieder in Ordnung.

0
ScottFoster1000