web-dev-qa-db-ja.com

ASP.NET WebApiの各リクエストでJWTトークンにカスタム検証を適用する方法は?

ベアラートークンを使用して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) },,

});

ここで、トークンが無期限になるように設定されているので、ベアラートークンで行われた各リクエストに追加のカスタム検証ステップを追加して、リクエストごとにいくつかの追加情報を検証し、必要に応じてアクセスを拒否できるようにします。

リクエストごとにこの検証を追加する適切な場所はどこですか?

13
Natan

着信トークンを認証または検証するための追加のロジックを追加するには:

1)認証プロバイダーの使用

  1. OAuthBearerAuthenticationProvider から継承するカスタムプロバイダーを作成するか、実装 IOAuthBearerAuthenticationProvider

  2. カスタム認証プロバイダーで、ValidateIdentity(...)RequestToken(...)をオーバーライド/実装して、リクエストごとに受信トークンを確認します

  3. JwtBearerAuthenticationOptions.Provider プロパティに割り当てて、カスタムプロバイダーを使用します。

例:

app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
    // ... other properties here
    Provider = new MyCustomTokenAuthenticationProvider()
    // ... other properties here
});

2)トークンハンドラーの使用

  1. JwtSecurityTokenHandler から継承するカスタムトークンハンドラーを作成する

  2. 拡張したい関連メソッドをオーバーライドします(多数あります!)

  3. JwtBearerAuthenticationOptions.TokenHandler プロパティに割り当てて、カスタムトークンハンドラーを使用します

例:

app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
    // ... other properties here
    TokenHandler = new MyCustomTokenHandler()
    // ... other properties here
});
18
Bishoy

.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トークン、HttpContextClaimsPrincipalなどが含まれることです。

1
Daniel Párraga

私が言う最も良い方法は、カスタム属性を書くことです。 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();
}
0
IMujagic