У меня есть случай, когда мне требуется как аутентификация с токенами на предъявителя, так и обычная аутентификация, но я получаю 403 Запрещено при каждом использовании Basic ([Authorize (AuthenticationSchemes = "BasicAuthentication")]).
,Это мой startup.cs:
services
.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(cfg =>
{
cfg.RequireHttpsMetadata = false;
cfg.SaveToken = true;
cfg.TokenValidationParameters = new TokenValidationParameters
{
...
};
})
.AddScheme<AuthenticationSchemeOptions, BasicAuthenticationHandler>("BasicAuthentication", null);
services.AddAuthorization(options =>
{
options.AddPolicy("BasicAuthentication",
authBuilder =>
{
authBuilder.AddAuthenticationSchemes("BasicAuthentication");
authBuilder.RequireClaim("NameIdentifier");
});
});
И я добавил обработчик для Basic:
public class BasicAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
if (!Request.Headers.ContainsKey("Authorization"))
return AuthenticateResult.Fail("Missing Authorization Header");
...
var claims = new[] {
new Claim(ClaimTypes.NameIdentifier, username),
new Claim(ClaimTypes.Role, "User"),
new Claim(ClaimTypes.Name, username)
};
var identity = new ClaimsIdentity(claims, Scheme.Name);
var principal = new ClaimsPrincipal(identity);
var ticket = new AuthenticationTicket(principal, Scheme.Name);
return AuthenticateResult.Success(ticket);
}
}
Обработчик возвращает Success для правильных случаев, но все еще возвращает 403.