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

时间:2019-04-09 17:01:53

标签: c# asp.net-core asp.net-core-2.0

回到ASP.NET Core 1中,身份验证将手动挂接到其配置的请求管道中:对于自定义身份验证过程,您只需定义一个AuthenticationMiddleware并将其挂接到管道中即可验证应该发生了。

在ASP.NET Core 2中,不再有AuthenticationMiddleware了,您应该在必须进行 all 身份验证的管道中的某个时刻执行UseAuthentication()

差异记录在这里:Hyperstack Isomorphic Operations

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

然后,我被告知可以在控制器上选择具有属性的所需方案,但是在所讨论的场景中我根本不使用MVC。因此,如何指定管道的特定分支:

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

        ...
    });

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

        ...
    });

即使在MVC中,身份验证也要在路由之前进行,那么在管道的UseAuthentication()点上如何使用可能使用的方案信息呢?

1 个答案:

答案 0 :(得分:1)

您可以使用依赖于调用AuthenticateAsync的命令式方法来定位特定的身份验证方案,该过程类似于以下内容:

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

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

    // ...
});

AuthenticateAsync将身份验证方案作为参数并返回AuthenticateResult的实例,该实例通过Succeeded表示成功或失败,并通过{{提供经过身份验证的ClaimsPrincipal} 3}}。

您还可以使用Principal针对特定策略执行授权。这是一个示例,说明如何将Principal中的AuthenticateResult通过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一样,IAuthorizationService表示通过Succeeded的成功或失败-它还提供了有关为何通过AuthorizationResult的授权失败的信息。