我对ASP.NET Core 2中的身份验证有疑问,调用 app.UseAuthentication()到底是什么?

这是基本前提条件,以便我可以实现我的自定义身份验证逻辑吗?我已经看过UseAuthentication的实现以及实际的中间件AuthenticationMiddleware了,但是老实说,我不知道这实际上在做什么以及为什么有必要。

换句话说:

我是否需要致电 UseAuthentication()
c# -  'UseAuthentication()'到底是干什么的?-LMLPHP

还是很不错,我仍然可以进行自定义身份验证?
c# -  'UseAuthentication()'到底是干什么的?-LMLPHP

如果我不用调用 UseAuthentication()就可以了,那么我仍然会对AuthenticationMiddleware实际做什么感兴趣。因此,如果您知道我也将不胜感激,也将不胜感激。

最佳答案

如果您编写自定义中间件(如您在示例中所做的那样),则无需调用AddAuthentication,因为身份验证中间件不会意识到您自己的中间件。
话虽这么说,您可能不想创建自己的中间件:您可能想要创建一个新的身份验证处理程序,该程序可以与ASP.NET身份验证框架很好地配合使用(以便在 Controller 上使用[Authorize]属性)。
要创建自定义身份验证,必须创建一个从AuthenticationHandler继承的专用处理程序,并实现相关方法。您可以看一下github上的基本身份验证示例:https://github.com/blowdart/idunno.Authentication,但这是一个快速示例,显示了自定义处理程序的要旨。

public class BasicAuthenticationOptions : AuthenticationSchemeOptions
{
    public BasicAuthenticationOptions()
    {
    }
}

internal class BasicAuthenticationHandler : AuthenticationHandler<BasicAuthenticationOptions>
{
    private const string _Scheme = "MyScheme";

    public BasicAuthenticationHandler(
        IOptionsMonitor<BasicAuthenticationOptions> options,
        ILoggerFactory logger,
        UrlEncoder encoder,
        ISystemClock clock) : base(options, logger, encoder, clock)
    {
    }

    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        string authorizationHeader = Request.Headers["Custom-Auth-Handler"];

        // create a ClaimsPrincipal from your header
        var claims = new[]
        {
            new Claim(ClaimTypes.NameIdentifier, "My Name")
        };

        var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(claims, Scheme.Name));
        var ticket = new AuthenticationTicket(claimsPrincipal,
            new AuthenticationProperties { IsPersistent = false },
            Scheme.Name
        );

        return AuthenticateResult.Success(ticket);
    }
}
然后,您可以在Startup.cs中注册新方案:
public void ConfigureServices(IServiceCollection services)
{
    services
        .AddAuthentication(BasicAuthenticationDefaults.AuthenticationScheme)
        .AddScheme<BasicAuthenticationOptions, BasicAuthenticationHandler>("MyScheme", options => { /* configure options */ })
}

09-11 18:10