0

私はMSALを探していますが、クライアントアプリケーションで正しい使い方を理解しようとしています。私の場合は、ユーザーを認証してから、idトークンを「プライベート」Web APIアプリケーションに対して使用したいと思います。MSAL:AcquireTokenSilentAsyncは常にエンドポイントと対話します

トークンがまだ有効で、要求スコープが満たされていれば、AcquireTokenSilentAsyncは認証エンドポイントへの余分のコールを実行せずにキャッシュから既存のトークンを再利用するという印象を受けました。私の解釈とそれはおそらく間違っている)。しかし、これはそうではないようです。私がfiddlerで見ているのは、このメソッドが常に認証エンドポイントにアクセスするということです。

当初は、IDベースを取得するためにクライアントサービスラッパーがこのメソッドを常に実行する必要があると考えていました。このトークンは、認証ベアラーヘッダーを通じてバックエンドWebサイトに渡されます。ここで私が何を意味するかの例です:

public async Task<string> GetAllWorkers() { 
    _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", await GetToken()); 

    var request = new HttpRequestMessage(HttpMethod.Get, _url); 
    var resposta = await _httpClient.SendAsync(request); 
    var content = await resposta.Content.ReadAsStringAsync(); 
    return content; 
} 

GetTokenは、ユーザーを認証するために使用される典型的なコードをラップする方法であること(AcquireTokenSilentAsyncを包むためのtry/catchブロックを使用すると、それが失敗した場合にユーザーをリダイレクトログインUIを表示するためのAcquireTokenAsyncメソッド)。

質問:私のバックエンドサービスが実際に行く方法の前に、この特別な呼び出しがありますか?それとも私が401を得るまで呼び出しトークンをキャッシュし、すべての内部のWebサービスでそれを再利用しなければならない(だけにしては、私は私のIDトークンをリフレッシュするために入手トークンメソッドを呼び出す必要があります?)

編集がより多くの情報を与えることを

_clientApp = new PublicClientApplication(ClientId, 
             Authority, 
             TokenCacheHelper.GetUserCache()); 

TokenCacheHelperは、ほとんどのAzure ADサンプルに付属するトークンキャッシュヘルパーです。

return (await _helper.AuthenticateUser()).IdToken 

そしてここのauthenticateUser方法であって:ここで、トークン

public async Task<AuthenticationResult> AuthenticateUser() { 
    try { 
     return await _clientApp.AcquireTokenSilentAsync(_scopes, _clientApp.Users.FirstOrDefault()); 
    } 
    catch (MsalUiRequiredException ex) { 
     return await RetryWithGraphicalUI(); 
    } 
} 

認証ヘッダーを返すGetToken方法は、上記の_clientAppフィールドをカプセル化ヘルパーと相互作用する単一のライナーでありますキャッシュヘルパーがヒットしています。私が理解できないのは、AcquireTokenSilentAsyncメソッドが常にoauth2エンドポイント(https://login.microsoftonline.com/ {azure ad guid} /oauth2/v2.0/token)を呼び出してしまう理由です。

一方、私のヘルパークラスはAuthenticationResultをキャッシュします。今、AcquireTokenSilentAsyncは、ベアラ認証ヘッダーで実行された呼び出しに応答して、「内部」アプリのWeb APIメソッドの1つが401を返すときにのみ呼び出されます。

+0

あなたのアプリケーションを初期化した権限についてもう少し教えてください。私たちはキャッシュがヒットしなかった理由を理解したいでしょう。 –

+0

こんにちはJean-Marc。 UIは表示されないためキャッシュがヒットしますが、acquiretokensilentasyncは常に認証エンドポイントを呼び出してトークンを取得します。もっとコードを表示したいですか? –

+0

PublicClientApplicationのコンストラクタ(これはパブリッククライアントアプリケーションであると仮定しています)。あなたは共通のエンドポイントに行きますか? MSA(Microsoft個人アカウント)のIDを使用していますか?またはAADのもの? –

答えて

1

最後に、AuthenticationResultをキャッシュしてIDトークンを取得しました。これは私にリモートコールを保存するので、これは最善の選択肢と思われます。 Webサービスが401を返すときには、AcquireTokenSilentAsyncに再度呼び出してみます。

関連する問題