AcquireTokenSilent a toujours échoué à acquérir le jeton en mode silencieux
À l'aide de ADAL j'ai deux AuthenticationContext
à l'aide d'un Jeton Cache persisté dans SQL.
À l'aide de AcquireTokenByAuthorizationCode
il écrit le Jeton dans la base de données, mais lors de l'utilisation de AcquireTokenSilent
je reçois toujours
Échoué à acquérir jeton en silence. Appel de la méthode AcquireToken
Voici les détails pour la réplication de la question:
- Je créer un Contexte
AuthenticationContext authContext = new AuthenticationContext(_authority, new AzureAdalCache(companyId, _entries, _unitOfWork));
Puis Je AcquireToken Par Autorisation
authContext.AcquireTokenByAuthorizationCode(authorizationCode, new Uri(redirectUri), _clientCredential);
À ce point, il enregistre une entrée dans la base de données
Si je peux appeler 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 Poste mon AzureAdalCache
mise en œuvre dans ce Gist.
Chaque entrée du Cache est comme ceci.
Ce qui me manque?
Mise à jour
Basé sur la réponse de commentaires de @vibronet j'ai cette
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;
source d'informationauteur Ricardo Polo
Vous devez vous connecter pour publier un commentaire.
Le problème était que, fondamentalement, j'ai été en utilisant Autorité Commune
https://login.windows.net/common/oauth2/authorize
dans mon Application. Il travaille pour AcquireTokenByAuthorizationCode (), mais pas pour AcquireTokenSilent().Si j'en avais besoin pour sauver la TenantId lors de l'appel AcquireTokenByAuthorizationCode() et une à l'autorité une autorité comme
https://login.windows.net/<tenant ID>/oauth2/authorize
lors de l'appel AcquireTokenSilent(). De cette façon, le même code ci-dessus fonctionne.Je ne comprends pas l'appel:
La UserIdentifier doit correspondre à la valeur dans le cache, et CompanyID ne ressemble pas tout de l'identifiant que vous obtenez en retour pour le jeton.
Veuillez jeter un oeil à l'exemple je vous ai cité sur l'autre fil, et plus précisément sur l'identifiant utilisé dans l'appel à AcquireTokenSilent dans https://github.com/AzureADSamples/WebApp-WebAPI-OpenIDConnect-DotNet/blob/master/TodoListWebApp/Controllers/TodoListController.cs
Vous n'obtenez pas de choisir identificateur à utiliser que dans l'appel, qui est déterminée par ce que les demandes d'AAD questions. La seule identifiants vous pouvez choisir sont à l'instance de cache de niveau, et non au niveau individuel AcquireToken* appels.
Vérifier si le jeton est dans le cache d'autre signe de sortir et demander à l'utilisateur de se connecter.
J'ai eu le même problème dans ASPNetCore (1.0) et la raison était que je n'étais pas stocker le jeton d'authentification après la connexion. Je l'ai résolu en ajoutant
OnAuthorizationCodeReceived
dans le Démarrage de la classe et de l'évolution de ma Réponse ype deResponseType = OpenIdConnectResponseType.CodeIdToken
.Espère que cela aide.
De l'échantillon:
https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect-aspnetcore/blob/aspnet10/WebApp-WebAPI-OpenIdConnect-DotNet/Startup.cs#L100