OpenIDを使用した認証サーバの設定


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.





  • パートV : OpenID接続

  • ロビンソン / 認証サーバ


    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 そして、有効なアクセストークンを使います.


    リフレッシュトークンの使用を有効にします.