OpenIDを使用した認証サーバの設定
11186 ワード
This article is part of a series called Setting up an Authorization Server with OpenIddict. The articles in this series will guide you through the process of setting up an OAuth2 + OpenID Connect authorization server on the the ASPNET Core platform using OpenIddict.
ロビンソン / 認証サーバ
OpenIDDictで実装された認証サーバ。
OpenIDDictはOpenID Connectプロトコルを実装します.これはOAutor 2プロトコルの上のアイデンティティ層です.
OpenID Connectプロトコルの実装は、クライアントアプリケーションに余分なトークンを発行します
identity token
. このトークンはエンドユーザを識別するためにクライアントアプリケーションによって使用できるユーザプロファイル情報を含んでいます.It's wise to keep your tokens small . したがって、OpenID Connectプロトコルは、クライアントがアイデンティティトークンに格納されていないエンドユーザーに関する余分な情報を取得できるUserInfoエンドポイントを公開する可能性を提供します.
この部分では、OpenID Connectプロトコルとどのように余分なユーザ情報を問い合わせるためにエンドポイントを追加する方法を参照してください.
OpenID接続を有効にする
として、OpenIDDictはOpenID接続プロトコルを実装している.あなたは余分なスコープを要求することによってこれをテストすることができます
openid
郵便配達人:応答で、あなたはアクセストークンと共にアイデンティティトークンを見つけます.
IDトークンに追加のプロファイル情報を格納するには、
Authorize
メソッドAuthorizationController
クライアントコードの流れを使用している場合は、認証コードフローを使用するか、トークンエンドポイントにクレームを追加する場合.目的地を設定してくださいIdentityToken
. 以下にデフォルトのクレームを使用する例を示しますemail
:public async Task<IActionResult> Authorize()
{
...
var claims = new List<Claim>
{
// 'subject' claim which is required
new Claim(OpenIddictConstants.Claims.Subject, result.Principal.Identity.Name),
new Claim("some claim", "some value").SetDestinations(OpenIddictConstants.Destinations.AccessToken),
new Claim(OpenIddictConstants.Claims.Email, "some@email").SetDestinations(OpenIddictConstants.Destinations.IdentityToken)
};
...
}
クレームが複数の目的地を持つことも可能であるので、我々は必要に応じてアクセストークンとアイデンティティトークンにクレームを加えることができます.IDトークンの内容を表示できますjwt.io :
{
"sub": "Robin van der Knaap",
"email": "some@email",
"oi_au_id": "e5e12b78-ddea-42df-8350-5b7bda36b07b",
"azp": "postman",
"at_hash": "iuzdujyas1p_1XjUuxtw9A",
"oi_tkn_id": "7f0ae652-c997-4425-bda5-6d024ea3acb3",
"aud": "postman",
"exp": 1607684956,
"iss": "https://localhost:5001/",
"iat": 1607683756
}
UserInfo終了点
アイデンティティトークンの他に、OpenID Connectプロトコルはまた、URLがユーザーに関する情報を得るのを許容します.userinfoエンドポイントを利用するには、エンドポイントを有効にし、
Startup.cs
ファーストoptions
.SetAuthorizationEndpointUris("/connect/authorize")
.SetTokenEndpointUris("/connect/token")
.SetUserinfoEndpointUris("/connect/userinfo");
options
.UseAspNetCore()
.EnableTokenEndpointPassthrough()
.EnableAuthorizationEndpointPassthrough()
.EnableUserinfoEndpointPassthrough();
認証サーバーを再起動してhttps://localhost:5001/.well-known/openid-configuration . userinfo終了点がパブリック設定ファイルに追加されることがわかります.次のステップは、UserInfoエンドポイントを実装することです.クライアントと共有するユーザー情報を決めることができます.このメソッドを
AuthorizationController
:[Authorize(AuthenticationSchemes = OpenIddictServerAspNetCoreDefaults.AuthenticationScheme)]
[HttpGet("~/connect/userinfo")]
public async Task<IActionResult> Userinfo()
{
var claimsPrincipal = (await HttpContext.AuthenticateAsync(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme)).Principal;
return Ok(new
{
Name = claimsPrincipal.GetClaim(OpenIddictConstants.Claims.Subject),
Occupation = "Developer",
Age = 43
});
}
ユーザー情報エンドポイントは、クライアントが有効なアクセストークンを持つときにのみアクセスできます.これが私たちがAuthorize
属性.これを実現するためには、Startup.cs
:public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseAuthentication();
app.UseAuthorization();
...
}
私たちが得るリクエストをするならば/connect/userinfo
そして、有効なアクセストークンを使います.次
リフレッシュトークンの使用を有効にします.
Reference
この問題について(OpenIDを使用した認証サーバの設定), 我々は、より多くの情報をここで見つけました https://dev.to/robinvanderknaap/setting-up-an-authorization-server-with-openiddict-part-v-openid-connect-a8jテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol