2017-02-13 43 views
1

我們遇到了令刷新令牌發揮作用的問題。最初,用戶使用ADAL的Web視圖登錄並獲取令牌。該令牌用於在Web API過期之前調用它。如我們所期望的那樣,如果沒有獲得Web提示的新令牌,服務器上會記錄一個錯誤,並且用戶會再次顯示登錄Web提示。使用ADFS 3.0,ADAL,Web API和Xamarin刷新令牌

從我們已閱讀的內容中,您應該在每次調用時使用AcquireTokenAsync並讓ADAL處理令牌/刷新令牌。

這是ADAL嘗試使用刷新令牌獲取新令牌時在服務器上發生的錯誤。我們試圖尋找那個錯誤,但沒有發現太多。

在OAuth令牌請求期間遇到錯誤。

附加數據

異常詳細信息: Microsoft.IdentityServer.Web.Protocols.OAuth.Exceptions.OAuthInvalidScopeException: MSIS9330:接收OAuth訪問令牌請求是無效的。在請求中接收到' '範圍'參數,並且AD FS不支持任何範圍 。收到的範圍:'openid'。在 Microsoft.IdentityServer.Web.Protocols.OAuth.OAuthToken.OAuthRefreshTokenRequestContext.Validate()

難道我們失去了一些東西?有沒有辦法設置範圍,或者這只是不適用於我們正在使用的當前版本? ADAL是將範圍發佈到ADFS服務器的人。

我們不使用Azure AD!

從視圖控制器在iOS應用呼叫:

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在網頁API:

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

這裏是我們的作品:

  • 帶有ADFS 3.0的Windows Server 2012 R2(內部部署)
  • SsoLifetime = 60
  • TokenLifetime(依賴方)= 10
  • ADAL 3.13.8
  • .NET的Web API
  • Xamarin iOS應用

下面是一些職位,我們用得到這個工作:

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/

回答

1

該問題出現在ADAL源代碼中。服務器日誌中的錯誤非常具體:

在請求中收到'scope'參數,並且AD FS不支持任何範圍。收到的範圍:'openid'。 ADAL庫在嘗試獲取刷新令牌時會發送一個scope參數。 ADFS 3.0不支持openid範圍,因此失敗。

從GitHub下載ADAL碼 - https://github.com/AzureAD/azure-activedirectory-library-for-dotnet

打開AcquireTokenHandlerBase.cs位於:

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; 
    } 

乾淨:

enter image description here

從SendTokenRequestByRefreshTokenAsync通話中移除範圍重建項目。將nuget引用替換爲新的DLL。確保在Xamarin iOS項目中包含平臺DLL。

enter image description here

現在,當ADAL試圖獲取刷新令牌它應該會成功。

enter image description here