2017-02-13 2 views
1

Wir haben Probleme, die Aktualisierungstokens zu funktionieren. Anfangs meldet sich der Benutzer mit der Webansicht von ADAL an und erhält ein Token. Mit diesem Token wird die Web-API aufgerufen, bis sie abläuft. Anstatt wie erwartet ein neues Token ohne die Web-Eingabeaufforderung zu erhalten, wird ein Fehler auf dem Server protokolliert und dem Benutzer wird erneut die Anmelde-Web-Eingabeaufforderung angezeigt.Aktualisieren Sie Token mit ADFS 3.0, ADAL, Web API und Xamarin

Von dem, was wir gelesen haben, sollten Sie AcquireTokenAsync bei jedem Aufruf verwenden und ADAL die Token/Refresh-Token behandeln lassen.

Hier ist der Fehler, den wir auf dem Server bekommen, wenn ADAL versucht, ein neues Token mit dem Refresh-Token zu erhalten. Wir haben versucht, nach diesem Fehler zu suchen, finden aber nicht viel.

Fehler bei OAuth-Tokenanforderung.

Weitere Daten

Ausnahmedetails: Microsoft.IdentityServer.Web.Protocols.OAuth.Exceptions.OAuthInvalidScopeException: MSIS9330: Die OAuth-Zugriffstoken Anforderung empfangen ist ungültig. Ein "Scope" -Parameter wurde in der Anfrage empfangen und AD FS unterstützt keinen Bereich mit . Erhaltener Umfang: 'openid'. bei Microsoft.IdentityServer.Web.Protocols.OAuth.OAuthToken.OAuthRefreshTokenRequestContext.Validate()

Fehlt etwas? Gibt es eine Möglichkeit, den Bereich festzulegen, oder funktioniert das nicht mit den aktuellen Versionen, die wir verwenden? ADAL ist derjenige, der den Beitrag mit dem Bereich zum ADFS-Server macht.

Wir verwenden Azure AD NICHT!

Der Anruf aus dem View-Controller in der iOS-App:

PlatformParameters p = new PlatformParameters(this); 

AuthenticationContext authContext = new AuthenticationContext("https://adfs.domain.com/adfs", false); 

AuthenticationResult _authResult = await authContext.AcquireTokenAsync("https://webapi.domain.com", "E1CF1107-FF90-4228-93BF-26052DD2C714", “http://anarbitraryreturnuri/”, p); 

Startup.Auth.cs in Web API:

public void ConfigureAuth(IAppBuilder app) 
     { 
      app.UseActiveDirectoryFederationServicesBearerAuthentication(
       new ActiveDirectoryFederationServicesBearerAuthenticationOptions 
       { 
        MetadataEndpoint = ConfigurationManager.AppSettings["ida:AdfsMetadataEndpoint"], 
        TokenValidationParameters = new TokenValidationParameters() 
        { 
         ValidAudience = ConfigurationManager.AppSettings["ida:Audience"], 
        }, 
       } 
     } 

Hier sind die Stücke, die wir haben:

  • Windows Server 2012 R2 mit ADFS 3.0 (lokal)
  • SsoLifetime = 60
  • TokenLifetime (vertrauende) = 10
  • ADAL 3.13.8
  • .NET Web API
  • Xamarin iOS App

Hier sind einige der Pfosten wir verwendet, um dieses zu erhalten Arbeit:

http://www.cloudidentity.com/blog/2013/10/25/securing-a-web-api-with-adfs-on-ws2012-r2-got-even-easier/

http://www.cloudidentity.com/blog/2015/08/13/adal-3-didnt-return-refresh-tokens-for-5-months-and-nobody-noticed/

Antwort

1

Das Problem liegt im ADAL-Quellcode. Der Fehler aus dem Serverprotokoll war ziemlich spezifisch:

Ein 'Bereich' Parameter wurde in der Anforderung empfangen und AD FS unterstützt keinen Bereich.Erhaltener Umfang: 'openid'. Die ADAL-Bibliothek sendet einen Bereichsparameter, wenn sie versucht, ein Aktualisierungstoken zu erhalten. ADFS 3.0 unterstützt den openid-Bereich nicht, so dass es fehlschlägt.

enter image description here

den Umfang entfernen aus dem SendTokenRequestByRefreshTokenAsync Aufruf:

protected async Task<AuthenticationResultEx> SendTokenRequestByRefreshTokenAsync(string refreshToken) 
    { 
     var requestParameters = new DictionaryRequestParameters(this.Resource, this.ClientKey); 
     requestParameters[OAuthParameter.GrantType] = OAuthGrantType.RefreshToken; 
     requestParameters[OAuthParameter.RefreshToken] = refreshToken; 
     //requestParameters[OAuthParameter.Scope] = OAuthValue.ScopeOpenId; **This line causes refresh to fail** 

     AuthenticationResultEx result = await this.SendHttpMessageAsync(requestParameters).ConfigureAwait(false); 

     if (result.RefreshToken == null) 
     { 
      result.RefreshToken = refreshToken; 
      PlatformPlugin.Logger.Verbose(this.CallState, 
       "Refresh token was missing from the token refresh response, so the refresh token in the request is returned instead"); 
     } 

     return result; 
    } 

reinigen und https://github.com/AzureAD/azure-activedirectory-library-for-dotnet

öffnen AcquireTokenHandlerBase.cs hier liegt -

den ADAL Code von Github herunterladen Erstellen Sie die Projekte neu. Ersetzen Sie die Nuget-Verweise durch die neuen DLLs. Stellen Sie sicher, dass Sie die Plattform-DLL in das Xamarin iOS-Projekt einbinden.

enter image description here

Nun, wenn ADAL versucht, eine Aktualisierung zu bekommen Token es gelingen sollte.

enter image description here

Verwandte Themen