2017-04-03 102 views
1

Azure訪問令牌在多線程環境中運行時即使使用無效密鑰也會返回。Azure以無效的客戶端密鑰返回有效的訪問令牌

我有一個集成測試,檢查無效的客戶端密鑰在獲取Azure訪問令牌時不會通過。

當隔離運行時,測試每次都會通過,這意味着無效的客戶端密鑰不會返回Azure訪問令牌。

但是,當與其他集成測試(在多個線程上)一起運行時,即使明顯無效的客戶端密鑰,此函數也會返回訪問令牌。

我沒有看到任何合法的原因,即使指定了一個完全無效的客戶端密鑰,這也是客戶端ID的緩存令牌。

請注意,當客戶端ID無效時,不會發生此行爲。

對此行爲有解釋嗎?

private async Task<string> GetAccessToken(string authority, string resource, string scope) 
    { 
     var clientCredential = new ClientCredential(clientId, clientSecret); 

     var context = new AuthenticationContext(authority, TokenCache.DefaultShared); 
     var result = await context.AcquireTokenAsync(resource, clientCredential); 

     Debug.WriteLine("----------------------------------"); 
     Debug.WriteLine(clientId); 
     Debug.WriteLine(clientSecret); 
     Debug.WriteLine(result.AccessToken); 

     return result.AccessToken; 
    } 

調試輸出

Debug Trace: 
---------------------------------- 
<...client id...> 
invalid secret 
<...valid token...> 

回答

3

這是因爲你的緩存仍然在高速緩存有效的訪問令牌。 ADAL首先檢查緩存,如果仍然有效(未過期),則返回訪問令牌。令牌緩存在client_id上作爲密鑰的維度之一,所以無效的client_id會按預期失敗。要強制磁帶庫使用祕密並進行網絡調用,您必須從緩存中刪除令牌。

+0

有趣的是,它並不關心訪問緩存時的祕密。如果單獨的線程可能從外部來源引入,並且他們可以訪問客戶端ID但不是祕密,那麼這不是一種安全風險嗎?這聽起來像我需要找到一種方法來刷新緩存,或者對它進行更多的控制。 –

+0

基於我的理解,具有祕密的網絡應用程序是一個機密的應用程序。這意味着我們應該確保它在安全的環境中運行,而祕密總是通過您的應用程序(從服務器端提供)來證明其身份。你會在你的場景中分享更多關於使用不正確祕密的信息嗎? –

+0

我不知道我有一個場景,這將是一個問題,但重要的是要了解這是如何工作,以便我不會引入問題。 –

相關問題