web-dev-qa-db-fra.com

AcquireTokenSilent n'a toujours pas réussi à acquérir le jeton en mode silencieux

Utilisation d'ADAL J'ai deux AuthenticationContext à l'aide d'un cache de jetons conservé en SQL.

En utilisant AcquireTokenByAuthorizationCode, le jeton est écrit dans la base de données, mais en utilisant AcquireTokenSilent, je reçois toujours

Impossible d’acquérir le jeton en mode silencieux. Méthode d'appel AcquireToken

Voici les détails pour la réplication du problème:

Je crée un contexte

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

Puis j'achèteToken par autorisation

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

À ce stade, il enregistre une entrée dans la base de données

Ensuite, si j'appelle cela, j'obtiens une exception.

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

J'ai aussi essayé avec le même résultat:

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

Je publie ma AzureAdalCache implémentation dans this Gist .

Chaque entrée du cache est comme ceci .

Qu'est-ce que je rate?

Mettre à jour

Basé sur la réponse des commentaires de @vibronet j'ai ceci

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

Le problème était que, fondamentalement, j'utilisais l'autorité commune https://login.windows.net/common/oauth2/authorize dans mon application. Cela fonctionne pour AcquireTokenByAuthorizationCode () mais pas pour AcquireTokenSilent ().

J'avais donc besoin de cela pour sauvegarder le TenantId lors de l'appel de AcquireTokenByAuthorizationCode () et une autorité utilise une autorité telle que https://login.windows.net/<tenant ID>/oauth2/authorizewhen de l'appel de AcquireTokenSilent (). De cette façon, le même code ci-dessus fonctionne.

8
Ricardo Polo

Je ne comprends pas l'appel:

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

UserIdentifier doit correspondre à la valeur du cache et CompanyID ne ressemble à aucun des identifiants que vous obtenez pour le jeton.

Veuillez consulter l'exemple que je vous ai indiqué sur l'autre fil, et plus particulièrement sur l'identificateur utilisé dans l'appel à AcquireTokenSilent dans https://github.com/AzureADSamples/WebApp-WebAPI-OpenIDConnect-DotNet/blob/master /TodoListWebApp/Controllers/TodoListController.cs

Vous ne devez pas choisir l’identifiant à utiliser dans cet appel, qui est déterminé par les revendications AAD. Les seuls identifiants que vous pouvez choisir se situent au niveau de l'instance de cache, et non dans des appels individuels AcquireToken *.

4
vibronet

Vérifiez si le jeton existe dans le cache, sinon déconnectez-vous et demandez à l'utilisateur de se connecter.

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

J'avais le même problème dans ASPNetCore (1.0) et la raison était que je ne stockais pas le jeton d'authentification après la connexion. Je l'ai résolu en ajoutant OnAuthorizationCodeReceived dans la classe de démarrage et en modifiant ma réponse en ResponseType = OpenIdConnectResponseType.CodeIdToken.

J'espère que ça aide.

Exemple: https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect-aspnetcore/blob/aspnet10/WebApp-WebAPI-OpenIdConnect-DotNet/Startups#L100

1
teocomi

C'est une vieille question - mais pour moi, je devais effacer mes cookies sur le client, puis le navigateur a été contraint de s'authentifier à nouveau et tout allait bien à nouveau.

0
ScottFoster1000