ASP.NET Core 中的多种身份验证方案

Multiple authentication schemes in ASP.NET Core

回到 ASP.NET 核心 1,身份验证将在其配置中手动连接到请求管道中:对于自定义身份验证过程,您只需定义一个 AuthenticationMiddleware 并将其连接到您的管道中在应该进行身份验证的地方。

在 ASP.NET Core 2 中,不再有 AuthenticationMiddleware 并且您应该在 all[= 管道中的某个点执行 UseAuthentication() 30=] 认证必然发生。

差异记录在此处:https://docs.microsoft.com/en-us/aspnet/core/security/authorization/limitingidentitybyscheme

为了区分不同的身份验证方式,有一些由魔术字符串标识的策略(ASP.NET Core 中有很多魔术字符串)。

然后我被告知我可以 select 我的控制器上带有属性的所需方案,但我在相关场景中根本不使用 MVC。那么如何为管道的特定分支指定:

    app.UseWhen(c => ..., app2 =>
    {
        // auth number 1 desired

        ...
    });

    app.UseWhen(c => ..., app2 =>
    {
        // auth number 2 desired

        ...
    });

甚至在 MVC 中,身份验证发生在路由之前,因此如何在管道中的 UseAuthentication() 点获得使用哪种方案的信息?

您可以通过调用 AuthenticateAsync 使用命令式方法针对特定的身份验证方案。这是一个例子:

app2.Use(async (ctx, next) =>
{
    var authenticateResult = await ctx.AuthenticateAsync("SchemeName");

    if (!authenticateResult.Succeeded)
    {
        ctx.Response.StatusCode = 401; // e.g.
        return;
    }

    // ...
});

AuthenticateAsync 将身份验证方案作为参数,returns 是 AuthenticateResult, which indicates success or failure via Succeeded and provides the authenticated ClaimsPrincipal via Principal.

的一个实例

您还可以使用 IAuthorizationService 针对特定策略执行授权。这是 AuthenticateResult 中的 Principal 如何通过 AuthorizeAsync:

传递的示例
var authorizationService = ctx.RequestServices.GetService<IAuthorizationService>();
var authorizationResult = await authorizationService.AuthorizeAsync(
    authenticateResult.Principal, "PolicyName");

if (!authorizationResult.Succeeded)
{
    ctx.Response.StatusCode = 403; // e.g.
    return;
}

// ...

AuthenticateResult一样,AuthorizationResult indicates success or failure via Succeeded - it also provides information about why authorisation failed via Failure