ASP.NET Core でのトークンベースの認証 質問する

ASP.NET Core でのトークンベースの認証 質問する

私はASP.NET Coreアプリケーションを使用しています。トークンベースの認証を実装しようとしていますが、新しいトークンをどのように使用すればよいかわかりません。セキュリティシステム私の場合はしかし、それらはあまり役に立ちませんでした。Cookie 認証または外部認証 (GitHub、Microsoft、Twitter) のいずれかを使用しているためです。

私のシナリオは次のとおりです: AngularJS アプリケーションは、/tokenユーザー名とパスワードを渡す URL を要求する必要があります。WebApi はユーザーを認証し、access_token次の要求で AngularJS アプリによって使用される値を返す必要があります。

現在のバージョンのASP.NETで必要なものを正確に実装する方法について素晴らしい記事を見つけました -ASP.NET Web API 2、Owin、Identity を使用したトークン ベースの認証しかし、同じことを ASP.NET Core でどのように実行すればよいかはわかりません。

私の質問は、トークンベースの認証で動作するように ASP.NET Core WebApi アプリケーションを構成するにはどうすればよいかということです。

ベストアンサー1

.Net Core 3.1 の更新:

David Fowler (ASP .NET Coreチームのアーキテクト) は、次のような非常にシンプルなタスクアプリケーションのセットを作成しました。JWT をデモンストレーションするシンプルなアプリケーション彼のアップデートとシンプルなスタイルをすぐにこの投稿に取り入れるつもりです。

.Net Core 2 用に更新されました:

この回答の以前のバージョンでは RSA を使用していましたが、トークンを生成するコードと同じコードがトークンの検証も行う場合は、実際には必要ありません。ただし、責任を分散している場合は、 のインスタンスを使用してこれを行うことをお勧めしますMicrosoft.IdentityModel.Tokens.RsaSecurityKey

  1. 後で使用する定数をいくつか作成します。私が行ったことは次のとおりです。

    const string TokenAudience = "Myself";
    const string TokenIssuer = "MyProject";
    
  2. これを Startup.cs に追加しますConfigureServices。これらの設定にアクセスするには、後で依存性注入を使用します。デバッグと本番で異なる構成を使用できる または オブジェクトであると想定しています。authenticationConfigurationキーを安全に保存してください。任意の文字列を使用できます。ConfigurationSectionConfiguration

    var keySecret = authenticationConfiguration["JwtSigningKey"];
    var symmetricKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(keySecret));
    
    services.AddTransient(_ => new JwtSignInHandler(symmetricKey));
    
    services.AddAuthentication(options =>
    {
        // This causes the default authentication scheme to be JWT.
        // Without this, the Authorization header is not checked and
        // you'll get no results. However, this also means that if
        // you're already using cookies in your app, they won't be 
        // checked by default.
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    })
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters.ValidateIssuerSigningKey = true;
            options.TokenValidationParameters.IssuerSigningKey = symmetricKey;
            options.TokenValidationParameters.ValidAudience = JwtSignInHandler.TokenAudience;
            options.TokenValidationParameters.ValidIssuer = JwtSignInHandler.TokenIssuer;
        });
    

    他の回答では、他の設定を変更しているのを見ました。たとえばClockSkew、デフォルトでは、クロックが正確に同期していない分散環境で動作するように設定されています。変更する必要があるのはこれらの設定だけです。

  3. User認証を設定します。などの情報を必要とするミドルウェアの前にこの行を配置する必要がありますapp.UseMvc()

    app.UseAuthentication();
    

    ただし、これによってトークンが や他の方法で発行されるわけではありませんSignInManager。JWT を出力するための独自のメカニズムを提供する必要があります (以下を参照)。

  4. を指定することもできますAuthorizationPolicy。これにより、 を使用した認証として Bearer トークンのみを許可するコントローラーとアクションを指定できるようになります[Authorize("Bearer")]

    services.AddAuthorization(auth =>
    {
        auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
            .AddAuthenticationTypes(JwtBearerDefaults.AuthenticationType)
            .RequireAuthenticatedUser().Build());
    });
    
  5. ここで難しい部分がやってきます。トークンの構築です。

    class JwtSignInHandler
    {
        public const string TokenAudience = "Myself";
        public const string TokenIssuer = "MyProject";
        private readonly SymmetricSecurityKey key;
    
        public JwtSignInHandler(SymmetricSecurityKey symmetricKey)
        {
            this.key = symmetricKey;
        }
    
        public string BuildJwt(ClaimsPrincipal principal)
        {
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
    
            var token = new JwtSecurityToken(
                issuer: TokenIssuer,
                audience: TokenAudience,
                claims: principal.Claims,
                expires: DateTime.Now.AddMinutes(20),
                signingCredentials: creds
            );
    
            return new JwtSecurityTokenHandler().WriteToken(token);
        }
    }
    

    次に、トークンが必要なコントローラーで、次のようになります。

    [HttpPost]
    public string AnonymousSignIn([FromServices] JwtSignInHandler tokenFactory)
    {
        var principal = new System.Security.Claims.ClaimsPrincipal(new[]
        {
            new System.Security.Claims.ClaimsIdentity(new[]
            {
                new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Name, "Demo User")
            })
        });
        return tokenFactory.BuildJwt(principal);
    }
    

    ここでは、すでにプリンシパルを持っていると仮定します。Identityを使用している場合は、IUserClaimsPrincipalFactory<>Userを に変身させますClaimsPrincipal

  6. テストするには: トークンを取得し、フォームに入力します翻訳元上記の手順では、構成のシークレットを使用して署名を検証することもできます。

  7. .Net 4.5 のベアラーのみの認証と組み合わせて、これを HTML ページの部分ビューでレンダリングしていた場合は、 を使用してViewComponent同じことを実行できるようになりました。これは、上記のコントローラー アクション コードとほぼ同じです。

おすすめ記事