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
。
回到 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
。