2017-10-09 60 views
0

已開發一個Web API,它使用ADAL .Net v3.14進行身份驗證。現在這裏是獲取access_token的代碼(使用ADAL提供的默認TokenCache)AcquireTokenAsync在Web API中使用UserAssertion失敗

var provider = "https://login.microsoftonline.com/XXXXXXXX.onmicrosoft.com" 
var service = "https://XXXXXXXX.onmicrosoft.com/XXXXXXService" //which is registered as service in Azure AD 
var clientId = "01d2b529-XXXX-XXXX-b794-XXXXXXXXXXXX" //client app registered on Azure AD 
AuthenticationContext authContext = new AuthenticationContext(provider); 
UserPasswordCredential uc = new UserPasswordCredential(user, password); 
AuthenticationResult result = authContext.AcquireTokenAsync(service, clientId, uc).ConfigureAwait(false).GetAwaiter().GetResult(); 

它成功返回Access_Token。現在1小時後,當該令牌到期,我已經實現下面的代碼它使用Refresh_Token更新(假設refresh_token會從緩存中被視爲實現ADAL TokenCache):

AuthenticationContext authContext = new AuthenticationContext(provider); 
    UserAssertion userAssertion = new UserAssertion(oldtoken, "urn:ietf:params:oauth:grant-type:jwt-bearer", upn); 
    AuthenticationResult result = authContext.AcquireTokenAsync(resource,clientId, userAssertion).ConfigureAwait(false).GetAwaiter().GetResult(); 
    var token = result.AccessToken 

此代碼給出錯誤:

「JWT令牌無效,AADSTS50027:無效的JWT令牌,令牌格式無效」。

我檢查了'oldtoken'變量,它是有效的JWT標記。

回答

0

你從哪裏獲得訪問令牌?在網頁API或客戶端?

如果您使用資源所有者密碼授權流程獲取web api端的訪問令牌。並且想要使用刷新令牌來更新訪問令牌。您只需要使用您的獲取令牌功能,因爲您正在獲取令牌直接使用用戶的憑證。

如果您在客戶端獲取訪問令牌並使用該訪問令牌訪問您的Web API,則客戶端應用程序應負責檢查有效的訪問令牌並使用刷新令牌更新訪問令牌。

+0

嗨,我正在web api端更新令牌,是不是可以使用userId來更新令牌而不是web api端的用戶憑據?此外,客戶端應用程序(如AngularJS SPA)將如何做,因爲這些應用程序將調用我們的Web API以獲取access_token – devangi

+0

web api端不能更新訪問令牌,因爲令牌緩存中不存在刷新令牌。如果客戶端是AngularJS SPA,則可以使用ADAL JS,它檢查現有令牌(在緩存中)的預計到期時間,並且如果令牌即將到期,則會使用不可見的iFrame將新令牌(續訂)請求發送到Azure AD。請參閱文檔[here](http://www.cloudidentity.com/blog/2014/10/28/adal-javascript-and-angularjs-deep-dive/)。並參考[代碼示例](https://github.com/Azure-Samples/active-directory-javascript-singlepageapp-dotnet-webapi)。 –

+0

感謝您的幫助,我錯過了clientId,因爲它未能獲得新的令牌 – devangi