私はMSALを使用してIDトークンを取得しています。これを使用してWeb APIアプリケーションにアクセスします。私はいくつかの質問があり、誰かが何が起こっているのか理解するのを助けることができるかどうか疑問に思っていました。MSALとAzure AD:ユーザーIDを取得したいとき、どのスコープを渡す必要がありますか?
クライアント側の認証プロセスから始めましょう。この場合、現在のユーザーを認証するために次のコードを使用しているWindowsフォームアプリケーションを構築しています(つまり、ユーザーがWebにアクセスしようとしたときにユーザーを検証するために使用されるIDトークンを取得するため) APIアプリ):
//constructor code
_clientApp = new PublicClientApplication(ClientId,
Authority, //which url here?
TokenCacheHelper.GetUserCache());
_scopes = new []{ "user.read" }; //what to put here?
//inside a helper method
try {
return await _clientApp.AcquireTokenSilentAsync(_scopes, _clientApp.Users.FirstOrDefault());
}
catch (MsalUiRequiredException ex) {
try {
return await _clientApp.AcquireTokenAsync(_scopes);
}
catch (MsalException ex) {
return null;
}
}
まず、権限パラメータに使用する値を指定します。この場合、私は、フォーム上のURLを使用しています:
https://login.microsoftonline.com/{Tenant}/oauth2/v2.0/token
しかし、私はまた、このような何かを離れて得ることができる印象の下だ:
https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration
それを1つのエンドポイントが私のAzure広告に固有のものであるのに対し、他のものは一般的な(すべてをキャッチした)URLのように見えます...これらのエンドポイントについての詳しい情報と、それぞれの目的はどこにありますか...
もう一つ私がかなり理解できなかったのは範囲です。私はMS Graph(またはその問題に関して他のAzure関連サービス)に問い合わせることには興味がありません。以前のバージョンのMSALライブラリでは、デフォルトのスコープの1つを参照することができました。しかし、それはもはや可能ではないようです(少なくとも、私はデフォルトのスコープを渡すべきではないと言って例外を試しました...)。
空のコレクション(例:new List<string>()
)またはnull
を渡すとエラーになります。だから、この場合、私はuser.read
スコープ(私は誤解されていない場合は、MS Graph APIで使用されています。これは明らかに必要ではありませんが、私は認証を得るために管理した唯一の方法でしたIDトークンを取得する必要があるときに呼び出しを実行する手掛かりがありますか?別のメソッドを呼び出す必要がありますか?
サーバー側に移動すると、認証ヘッダー(無記名)でIDトークンを渡す呼び出しに制限され、このsampleによると、私はこのようなものを使用する必要があります。さて、これが作業を行い、それがドンすべてのリクエストに対して401を返します
private void ConfigureAuth(IAppBuilder app) {
var authority = "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration";
app.UseOAuthBearerAuthentication(
new OAuthBearerAuthenticationOptions {
AccessTokenFormat = new JwtFormat(GetTokenValidationParameters(),
new OpenIdConnectCachingSecurityTokenProvider(authority)),
Provider = new OAuthBearerAuthenticationProvider {
OnValidateIdentity = ValidateIdentity
}
});
}
をVAを持っている蓋IDトークン。しかし、1つの質問があります:ユーザー名(コントローラのUser.Identity.Name
)を識別するために使用すべきTicket Identityからのクレームを指定する方法はありますか?あなたが見ることができるように
private Task ValidateIdentity(OAuthValidateIdentityContext arg) {
//username not getting correctly filled
//so, i'm handling this event in order to set it up
//from the preferred_username claim
if (!arg.HasError && arg.IsValidated) {
var identity = arg.Ticket.Identity;
var username = identity.Claims.FirstOrDefault(c => c.Type == "preferred_username")?.Value ?? "";
if (!string.IsNullOrEmpty(username)) {
identity.AddClaim(new Claim(ClaimTypes.Name, username));
}
}
return Task.CompletedTask;
}
、私がいたIDトークン(からpreferred_username請求を探しています:この場合、私はこのようなコードでそれを行うためにOnValidateIdentity
を処理終了しましたその値を使ってNameの要求を設定します。私にこれを自動的にさせるオプションはありますか? OAuthBearerAuthenticationMiddleware
の設定で何か不足していますか?あなたのまずクエリについて
こんにちはMohit。 1が助けになりました。 2、実際にはありません。たとえば、それらのスコープの一部はデフォルトで送信され、私が言ったように、スコープコレクションで再利用することはできません。 3に関して、私は答えを見つけました:https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/f10a045459e7cb07548806561a47ecdb3471f5f6/src/Microsoft.IdentityModel.Tokens/TokenValidationParameters.cs#L413 –