0

我在Windows 8.1商店應用中實現了Azure Active Directory。Azure Active Directory單點登錄檢測到多個令牌問題

時,應用程序打開它打開了AAD登錄彈出和用戶將進入電子郵件和密碼,然後登錄到該應用程序,對於我使用下面的代碼它工作正常第一次。

AADLoginFirstTime() 
{ 

AuthenticationContext ac = new AuthenticationContext(App.authority); 
        AuthenticationResult ar = await ac.AcquireTokenAsync(App.resourceURI, App.clientID, (Uri)null,PromptBehavior.Always); 
        JObject payload = new JObject(); 
        payload["access_token"] = ar.AccessToken; 
        user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload); 

//saving user token into vault 
credential = new PasswordCredential(provider, 
          user.UserId, user.MobileServiceAuthenticationToken); 
         vault.Add(credential); 

} 

從第二次起,我使用調用的代碼

AADLoginSecondTime() 

{ 

AuthenticationContext ac = new AuthenticationContext(App.authority); 
         AuthenticationResult ar = await ac.AcquireTokenAsync(App.resourceURI, App.clientID, (Uri)null); 
         JObject payload = new JObject(); 
         payload["access_token"] = ar.AccessToken; 
         user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload); 

} 

的差值低於線是第二次起LoginAsync方法沒有提示行爲。

這對單個用戶來說工作正常。

用於註銷,我只是瀏覽網頁登錄屏幕和呼叫AADLoginFirstTime()方法來顯示登錄彈出。

當它提示登錄彈出如果我使用另一個用戶AAD憑證並登錄到應用程序,從下次打開應用程序,現在調用AADLoginSecondTime()方法,然後該應用程序將引發一個稱爲移動服務無效令牌的異常。

AuthenticationResult ar = await ac.AcquireTokenAsync(App.resourceURI, App.clientID, (Uri)null); 

該方法返回一個空的標記。

enter image description here

這是造成因爲以前沒有用戶從應用完全loggedout的?如果是我怎樣才能完全註銷以前的用戶?

回答

1

每次你得到ADAL令牌,將(與很多其他的東西)的持久性高速緩存保存。如果你想刷新緩存,你可以撥打ac.TokenCache.Clear()。如果你想刪除特定用戶的令牌,你可以對緩存運行一個LINQ查詢並刪除特定的項目。請注意,這全部獨立於移動服務。

0

當用戶登錄到使用AAD登錄屏幕首次應用,成功登錄後,AAD將返回用戶的唯一ID。 現在我們將在應用程序的LocalSettings中保存該用戶的唯一ID。

 AADLoginFirstTime() 
    { 
    AuthenticationContext ac = new AuthenticationContext(App.authority); 
         AuthenticationResult ar = await ac.AcquireTokenAsync(App.resourceURI, App.clientID, (Uri)null,PromptBehavior.Always); 
         JObject payload = new JObject(); 
         payload["access_token"] = ar.AccessToken; 
         user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload); 

         Windows.Storage.ApplicationData.Current.LocalSettings.Values["AADUniqueId"] = ar.UserInfo.UniqueId; 
} 
當應用程序打開,我們將通過用戶AAD AcquireTokenAsync(的唯一ID)方法,就像在高速緩存下面

AADLoginSecondTime() 
{ 
    UserIdentifier userIdent = new UserIdentifier(AADUniqueId, UserIdentifierType.UniqueId);      
         AuthenticationContext ac = new AuthenticationContext(App.authority); 
         AuthenticationResult ar = await ac.AcquireTokenAsync(App.resourceURI, App.clientID, (Uri)null,PromptBehavior.Never, userIdent); 
         JObject payload = new JObject(); 
         payload["access_token"] = ar.AccessToken; 
         user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload); 
} 

AAD尋找誰擁有唯一ID,並驗證該用戶與用戶

下一次AAD在後臺並導航到登陸頁面。

只有當您想要維護用戶的緩存時,此解決方案纔是首選。 否則在用戶從應用程序註銷時清除緩存。

ac.TokenCache.Clear(); 
相關問題