Asp.Net Core中带了一套帐户角色框架,通过它,可以实现:
- 登录
- 帐户注册
- 基于角色控制
这一套框架本身具备了基本的功能,也具有很强的扩展性,正是因为扩展性要求,它的代码复杂度也很高,不易阅读。
首先,我们要明确,整个框架分为三个部分:
1、Authentication,认证
2、Identity,身份
3、Authorization,授权
它们是各自独立,可以在Program.cs中进行配置并在管道中启用,如下则启用了认证和授权。
我们先说说认证。
app.UseAuthentication();
app.UseAuthorization();
通过Authentication,对身份凭证(存储在Session、Cookie、LocalStorage中信息)进行验证。
核心处理在AuthenticationMiddleware中,通过Invoke方法执行。
这是Asp.net Core,重点在于WEB应用,所以关于身份验证也是基于HTTP的。
AuthenticationScheme,定义身份验证方案,其cs文件,居然位于 Http\Authenication\Abstractions下。
AuthenticationScheme中最重要的一个属性,就是类型为IAuthenticationHandler的Handler,顾名思义这个就是实际用于处理身份验证的接口,任何实现这个接口的类,都可以是来进行身份验证。
IAuthenticationHandler最核心的三个方法:
- AuthenticateAsync,返回结果 AuthenticateResult
- ChallengeAsync
- ForbidAsync
分别对应验证、挑战、禁止三种场景,这里先不展开讨论。
继续说Invoke,执行时,有如下这一段,表示获取DefaultAuthicationScheme来执行,那么问题来了,这个Default从哪里来,我们继续探讨。
var defaultAuthenticate = await Schemes.GetDefaultAuthenticateSchemeAsync();
if (defaultAuthenticate != null)
{
var result = await context.AuthenticateAsync(defaultAuthenticate.Name);
if (result?.Principal != null)
{
context.User = result.Principal;
}
if (result?.Succeeded ?? false)
{
var authFeatures = new AuthenticationFeatures(result);
context.Features.Set<IHttpAuthenticationFeature>(authFeatures);
context.Features.Set<IAuthenticateResultFeature>(authFeatures);
}
}
在AuthenticationOptions中,有如下这一段代码,可以看出它来自于Option设置。
/// <summary>
/// Used as the fallback default scheme for all the other defaults.
/// </summary>
public string? DefaultScheme { get; set; }
/// <summary>
/// Used as the default scheme by <see cref="IAuthenticationService.AuthenticateAsync(HttpContext, string)"/>.
/// </summary>
public string? DefaultAuthenticateScheme { get; set; }
不过我们有时候,在Program.cs中并不能看到这个设置,那应该是在其他配置中默认了。
这里就要说延展到Identity,身份这一块了。