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;
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/authorize
when de l'appel de AcquireTokenSilent (). De cette façon, le même code ci-dessus fonctionne.
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 *.
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);
}
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.
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.