ベアラートークンを使用してWeb API呼び出しを認証するときに、各リクエストにカスタム検証を追加することはできますか?
次の構成を使用しており、アプリケーションはすでにJWTトークンを正しく検証しています。
app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
{
AuthenticationType = "jwt",
TokenEndpointPath = new PathString("/api/token"),
AccessTokenFormat = new CustomJwtFormat(),
Provider = new CustomOAuthProvider(),
});
app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
AllowedAudiences = new[] { "all" },
IssuerSecurityTokenProviders = new[] { new SymmetricKeyIssuerSecurityTokenProvider(Config.JWT_Issuer, Config.JWT_Key) },,
});
ここで、トークンが無期限になるように設定されているので、ベアラートークンで行われた各リクエストに追加のカスタム検証ステップを追加して、リクエストごとにいくつかの追加情報を検証し、必要に応じてアクセスを拒否できるようにします。
リクエストごとにこの検証を追加する適切な場所はどこですか?
着信トークンを認証または検証するための追加のロジックを追加するには:
OAuthBearerAuthenticationProvider
から継承するカスタムプロバイダーを作成するか、実装 IOAuthBearerAuthenticationProvider
カスタム認証プロバイダーで、ValidateIdentity(...)
やRequestToken(...)
をオーバーライド/実装して、リクエストごとに受信トークンを確認します
JwtBearerAuthenticationOptions.Provider
プロパティに割り当てて、カスタムプロバイダーを使用します。
例:
app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
// ... other properties here
Provider = new MyCustomTokenAuthenticationProvider()
// ... other properties here
});
JwtSecurityTokenHandler
から継承するカスタムトークンハンドラーを作成する
拡張したい関連メソッドをオーバーライドします(多数あります!)
JwtBearerAuthenticationOptions.TokenHandler
プロパティに割り当てて、カスタムトークンハンドラーを使用します
例:
app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
// ... other properties here
TokenHandler = new MyCustomTokenHandler()
// ... other properties here
});
.Net Coreでは、これをJwtBearerOptions
に追加できます。
options.Events = new JwtBearerEvents
{
OnTokenValidated = AdditionalValidation
};
検証関数は次のようになります。
private static Task AdditionalValidation(TokenValidatedContext context)
{
if ( /* any validation */ )
{
context.Fail("Failed additional validation");
}
return Task.CompletedTask;
}
良いニュースは、context
に必要なすべて、JWTトークン、HttpContext
、ClaimsPrincipal
などが含まれることです。
私が言う最も良い方法は、カスタム属性を書くことです。 AuthorizeAttribute
クラスを継承してAuthorizeCore
メソッドをオーバーライドする必要がある場合は、カスタム検証を追加できます。
完了したら、コントローラーまたはメソッドをそれで装飾します。
https://msdn.Microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v = vs.118).aspx
実装例:
public class MyCustomAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
// your validation here
}
}
使用例:
[MyCustom]
public ActionResult MyAction()
{
return View();
}