2017-04-03 12 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は最初にキャッシュをチェックし、まだ有効であれば(期限切れではない)アクセストークンを返します。トークンキャッシュは、キーの次元の1つとしてclient_idでピボットするため、無効なclient_idは期待どおりに失敗します。ライブラリにシークレットを使用させてネットワークコールを行うようにするには、キャッシュからトークンを削除する必要があります。

+0

キャッシュにアクセスする際の秘密は気にしません。別のスレッドが外部ソースから導入され、クライアントIDにアクセスできますが、秘密ではない場合、セキュリティ上のリスクはありますか?私は、キャッシュをフラッシュする方法を見つける必要があるか、それ以上の制御を行うように思えます。 –

+0

私の理解に基づいて、秘密を持っているWebアプリは機密アプリです。つまり、安全な環境で動作するようにする必要があります。また、秘密情報は、常にあなたのアプリ(サーバー側など)から提供され、その身元を証明します。間違った秘密の使用についてあなたのシナリオでもっと多くの情報を共有したいと思いますか? –

+0

これはまだ問題になるシナリオがあるかどうかはわかりませんが、問題の導入方法を理解することが重要です。 –

関連する問題