У меня есть случай, когда мне нужно использовать 2 типа аутентификации в одном веб-приложении:
для MVC части приложения - базовая аутентификация Cookie, а для угловой части - базовая аутентификация JWT Token.
Я хотел бы использовать конфигурационный подход над аннотацией.
В файле setup.cs я хотел бы настроить: все методы-контроллеры, имеющие / api / * в URL-пути для использования базовой аутентификации токена JWT, и все методы-контроллеры, в которых нет / api / * для использования Cookie.
Для реализации этого я использую две политики в сочетании с пользовательским AuthorizeFilter:
var jwtPolicy = new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme)
.RequireAuthenticatedUser()
.Build();
var cookiePolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new CustomAuthorizeFilter(jwtPolicy, applyOnPath: "/api"));
options.Filters.Add(new CustomAuthorizeFilter(cookiePolicy, notApplyOnPath: "/api"));
И вот реализация CustomAuthorizeFilter:
public class CustomAuthorizeFilter : AuthorizeFilter
{
private string _applyOnPath;
private string _notApplyOnPath;
public CustomAuthorizeFilter(AuthorizationPolicy policy, string applyOnPath = null, string notApplyOnPath = null) : base(policy)
{
_applyOnPath = applyOnPath;
_notApplyOnPath = notApplyOnPath;
}
public override Task OnAuthorizationAsync(Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext context)
{
if (_applyOnPath != null && context.HttpContext.Request.Path.StartsWithSegments(_applyOnPath) == true)
return base.OnAuthorizationAsync(context);
else if (_notApplyOnPath != null && context.HttpContext.Request.Path.StartsWithSegments(_notApplyOnPath) == false)
return base.OnAuthorizationAsync(context);
else //Otherwise apply this policy
return Task.FromResult(0);
}
}
В .netCore 2.0 все работало нормально, но после обновления до .netCore 2.1. * Перестало работать ...
У кого-нибудь есть идея, в чем проблема?