Как применить специальную проверку к токену JWT для каждого запроса для ASP.NET WebApi?

Можно ли добавить пользовательскую проверку на каждый запрос при аутентификации вызовов веб-ави с использованием токена-носителя?

Я использую следующую конфигурацию, и приложение уже правильно проверяет маркеры 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) },,

});

Теперь, поскольку токены установлены так, чтобы они никогда не заканчивались, я хотел бы добавить дополнительный настраиваемый шаг проверки для каждого запроса, сделанного с токеном-носителем, поэтому я могу проверить некоторую дополнительную информацию для каждого запроса и, если необходимо, отказаться от доступа.

Где подходящее место для добавления этой проверки для каждого запроса?

Ответ 1

Чтобы добавить дополнительную логику для аутентификации или проверки входящих токенов:

1) Использование поставщика проверки подлинности

  • Напишите пользовательский поставщик наследовать от OAuthBearerAuthenticationProvider или внесите IOAuthBearerAuthenticationProvider p >

  • в вашем пользовательском поставщике проверки подлинности, переопределите/выполните ValidateIdentity(...) и/или RequestToken(...), чтобы проверить входящий токен с каждым запросом

  • Используйте свой пользовательский поставщик, присвоив его JwtBearerAuthenticationOptions.Provider свойство

Пример:

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

2) Использование обработчика токена

  • Напишите собственный обработчик обработчика токенов из JwtSecurityTokenHandler

  • переопределить любой подходящий метод, который вам нравится расширять (их много!)

  • Используйте свой собственный обработчик маркера, присвоив его JwtBearerAuthenticationOptions.TokenHandler свойство

Пример:

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

Ответ 2

Лучший способ, я бы сказал, - написать пользовательский атрибут. Вам нужно наследовать метод AuthorizeAttribute class и overridde 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();
}

Ответ 3

в .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 и т.д.