Как применить специальную проверку к токену 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) Использование поставщика проверки подлинности
Пример:
app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
// ... other properties here
Provider = new MyCustomTokenAuthenticationProvider()
// ... other properties here
});
2) Использование обработчика токена
Пример:
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
и т.д.