私は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
。
後で使用する定数をいくつか作成します。私が行ったことは次のとおりです。
const string TokenAudience = "Myself"; const string TokenIssuer = "MyProject";
これを Startup.cs に追加します
ConfigureServices
。これらの設定にアクセスするには、後で依存性注入を使用します。デバッグと本番で異なる構成を使用できる または オブジェクトであると想定しています。authenticationConfiguration
キーを安全に保存してください。任意の文字列を使用できます。ConfigurationSection
Configuration
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
、デフォルトでは、クロックが正確に同期していない分散環境で動作するように設定されています。変更する必要があるのはこれらの設定だけです。User
認証を設定します。などの情報を必要とするミドルウェアの前にこの行を配置する必要がありますapp.UseMvc()
。app.UseAuthentication();
ただし、これによってトークンが や他の方法で発行されるわけではありません
SignInManager
。JWT を出力するための独自のメカニズムを提供する必要があります (以下を参照)。を指定することもできます
AuthorizationPolicy
。これにより、 を使用した認証として Bearer トークンのみを許可するコントローラーとアクションを指定できるようになります[Authorize("Bearer")]
。services.AddAuthorization(auth => { auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder() .AddAuthenticationTypes(JwtBearerDefaults.AuthenticationType) .RequireAuthenticatedUser().Build()); });
ここで難しい部分がやってきます。トークンの構築です。
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
。テストするには: トークンを取得し、フォームに入力します翻訳元上記の手順では、構成のシークレットを使用して署名を検証することもできます。
.Net 4.5 のベアラーのみの認証と組み合わせて、これを HTML ページの部分ビューでレンダリングしていた場合は、 を使用して
ViewComponent
同じことを実行できるようになりました。これは、上記のコントローラー アクション コードとほぼ同じです。