2015-04-20 3 views
9

Mit ADAL habe ich zwei AuthenticationContext, die einen in SQL persistenten Token Cache verwenden.AcquireTokenSilent konnte das Token im Hintergrund nicht abrufen

Mit AcquireTokenByAuthorizationCode den Token in der Datenbank schreibt, aber wenn AcquireTokenSilent mit erhalte ich immer

Fehlgeschlagen Token still zu erwerben. Call-Methode AcquireToken

Hier sind die Details für die Replikation der Ausgabe:

ich einen Kontext schaffen

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

Dann habe ich von Authorization AcquireToken

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

An dieser Stelle ist es speichert einen Eintrag in der Datenbank

Dann, wenn ich das anrufe, bekomme ich eine Ausnahme.

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

ich auch mit dem gleichen Ergebnis versucht:

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

ich in this Gist meine AzureAdalCache Umsetzung veröffentlichen.

Jeder Eintrag des Caches ist like this.

Was fehlt mir?

aktualisieren

Basierend auf Antwort Kommentare 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; 

Antwort

5

Das Problem war, dass ich im Allgemeinen Common Authority in meiner App verwendete. Es funktioniert für AcquireTokenByAuthorizationCode(), aber nicht für AcquireTokenSilent().

Also ich brauchte es, um die TenantId zu speichern, wenn Aufruf AcquireTokenByAuthorizationCode() und eine Autorität eine Autorität wie https://login.windows.net/<tenant ID>/oauth2/authorize verwenden, wenn AcquireTokenSilent() aufrufen. Auf diese Weise funktioniert der gleiche Code oben.

+0

Beachten Sie außerdem, dass die GUID, die die TenantId und die UniqueId des Benutzers in einigen Versionen von ADAL ist, Fall sind empfindlich, weil sie Kleinbuchstaben sein müssen, damit der Cache sie korrekt lädt. – Andacious

+0

jeder Beispielcode würde helfen. weil AcquireTokenByAuthorizationCodeAsync unterschiedliche Parameter haben wird. – Kurkula

3

Ich verstehe nicht, den Anruf:

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

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

Ich zeigte Dich auf dem anderen Thread bitte einen Blick auf der Probe nehmen, und zwar auf der Kennung im Aufruf von AcquireTokenSilent verwendet in https://github.com/AzureADSamples/WebApp-WebAPI-OpenIDConnect-DotNet/blob/master/TodoListWebApp/Controllers/TodoListController.cs

Sie erhalten in diesem Anruf nicht zu wählen, welche Kennung zu verwenden, Das hängt davon ab, welche Ansprüche AAD stellt. Die einzigen Kennungen, die Sie auswählen können, sind auf der Ebene der Cache-Instanzen und nicht in einzelnen AcquireToken * -Aufrufen.

+1

Dank @vibronet. Ich sehe, dass es mir sehr schlecht geht. Ich sollte Zeichenfolge verwenden UserObjectID = ClaimsPrincipal.Current.FindFirst ("http://schemas.microsoft.com/identity/claims/objectidentifier") .Value; Aber ... wie kann ich auf ClaimsPrincipal.Current im Hintergrund Job zugreifen? Ich bekomme "Objektreferenz nicht auf eine Instanz eines Objekts festgelegt" –

+0

Sie müssen den richtigen Wert irgendwo speichern und weitergeben :) oder Sie müssen eine Web-API verfügbar machen, wenn Sie die Logik auf Anforderung auslösen möchten – vibronet

+0

Aber. .. Wie kann ich den Anspruch in der Website erhalten, wenn ich keine Azure-Authentifizierung in meiner Website habe? Ich meine, die Benutzer auf der Website sind lokal für die App (mit ASP.NET Identity EntityFramework). Ich erlaube dem Benutzer, seine azure AD für einen Hintergrundjob zu registrieren, aber ich werde die Authentisierung und Ansprüche auf der Website nicht ändern. Also irgendeine Idee darüber, was ich als UserId für AcquireTokenSilent() übergeben soll? –

1

Ich hatte das gleiche Problem in ASPNetCore und der Grund war, dass ich das Authentifizierungstoken nach der Anmeldung nicht gespeichert habe. Ich löste es durch Hinzufügen von OnAuthorizationCodeReceived in der Startup-Klasse und ändern meine Antwort ype auf ResponseType = OpenIdConnectResponseType.CodeIdToken.

Hoffe es hilft.

Probe:. https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect-aspnetcore/blob/master/WebApp-WebAPI-OpenIdConnect-DotNet/Startup.cs#L100

0

Überprüfen Sie, ob Token sonst im Cache vorhanden ist, wird sich abmelden und fragen Benutzer sich anmelden

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); 
        } 
Verwandte Themen