在非MVC Asp.Net Core 2.x中基于授权头方案动态进行身份验证

问题描述 投票:0回答:1

我正在创建一个API,它不使用MVC,而是使用通用中间件。应该可以针对Basic和(Jwt)承载方案进行身份验证(我知道Basic Auth的安全漏洞)

我可以很容易地在服务中注册这两个方案,但app.UseAuthentication中间件只会尝试对默认方案进行身份验证(这是故意的并在文档中描述)。允许同一端点的多个方案可以通过授权过滤器在MVC中完成,但我找不到非MVC场景的简单解决方案

我看到,很多人都试图达到同样的目标:https://github.com/aspnet/AspNetCore/issues/3620 https://github.com/aspnet/Security/issues/1469

asp.net-core authorization asp.net-core-2.0 basic-authentication
1个回答
1
投票

我最终定义了一个基于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

© www.soinside.com 2019 - 2024. All rights reserved.