我正在创建一个API,它不使用MVC,而是使用通用中间件。应该可以针对Basic和(Jwt)承载方案进行身份验证(我知道Basic Auth的安全漏洞)
我可以很容易地在服务中注册这两个方案,但app.UseAuthentication
中间件只会尝试对默认方案进行身份验证(这是故意的并在文档中描述)。允许同一端点的多个方案可以通过授权过滤器在MVC中完成,但我找不到非MVC场景的简单解决方案
我看到,很多人都试图达到同样的目标:https://github.com/aspnet/AspNetCore/issues/3620 https://github.com/aspnet/Security/issues/1469
我最终定义了一个基于https://github.com/aspnet/Security/issues/1469#issuecomment-334982498的简单中间件
app.Use(async (context, next) =>
{
var authHeader = AuthenticationHeaderValue.Parse(context.Request.Headers[HeaderNames.Authorization]);
var schemeName = authHeader?.Scheme ?? string.Empty;
var provider = context.RequestServices.GetService<IAuthenticationSchemeProvider>();
var scheme = await provider.GetSchemeAsync(schemeName);
if (scheme != null)
{
var result = await context.AuthenticateAsync(scheme.Name);
if (result.Succeeded)
{
context.User = result.Principal;
}
}
await next.Invoke();
});
从2.1开始,可以添加自定义方案策略并使用AuthenticationSchemeOptions.ForwardDefaultSelector
转发默认方案,请参阅:https://github.com/aspnet/Security/issues/1469#issuecomment-399239254