回到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()
点上如何使用可能使用的方案信息呢?
答案 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
的授权失败的信息。