HTML5技术

ASP.NET Core 之 Identity 入门(二) - Savorboard(2)

字号+ 作者:H5之家 来源:H5之家 2016-11-16 13:00 我要评论( )

有些同学可能会问了,如果 AuthenticationManager 不提供接口的话,只是一个抽象类的话,那如果自定义认证方法就必须继承它,这对于开发者来说是不友好的,也违背了面向接口编程的理念。嗯,确实是这样,那么接口来

有些同学可能会问了,如果 AuthenticationManager 不提供接口的话,只是一个抽象类的话,那如果自定义认证方法就必须继承它,这对于开发者来说是不友好的,也违背了面向接口编程的理念。嗯,确实是这样,那么接口来了:

public interface IAuthenticationHandler { void GetDescriptions(DescribeSchemesContext context); Task AuthenticateAsync(AuthenticateContext context); Task ChallengeAsync(ChallengeContext context); Task SignInAsync(SignInContext context); Task SignOutAsync(SignOutContext context); }

这个接口是在 AuthenticationManager 实现类 DefaultAuthenticationManager 中延伸出来的,所以大家不用再去看里面的源码了,记住以后如果需要重写认证相关的东西,实现IAuthenticationHandler就可以了。

Authentication 中间件

对 IAuthenticationHandler 的初步实现,封装了 AuthenticationHandler 这个抽象类,把具体的核心功能都交给下游去实现了,下面的CookieAuthentication 中间件核心类 CookieAuthenticationHandler 就是继承自AuthenticationHandler, 知道这么多就够了。

CookieAuthentication 中间件

故事还要继续,奥巴马在接到小李递来的身份证和火车票之后,首先拿着火车票在一个二维码机器上扫描了一下,然后又拿着身份证在一个机器上刷了一下,经过核查,发现都没有问题。于是拿起印章在上面盖了一个 “ 验讫 ”。

这中间都发生了什么呢?

首先,在二维码扫描的过程,这个过程二维码机器会解析你火车票上的二维码,如果发现解析失败,会直接响应认证失败。也就是你别想进站了。

如果解析成功,就会得到你这个票据中的信息了,然后拿到你票据里面的的当事人信息进行验证是否被列为了铁路局黑名单中。

如果验证通过,则会给你颁发一个识别码,把符合你身份的一个识别码写入到你的火车票中和检票员旁边的电脑系统中,即 “ 验讫 ”。

话说这个验讫有点高级,它会向你的火车票芯片中写入一些信息,那么都写入些什么信息呢? 1、奥巴马个人的信息。2、验证途中的一些上下信息。3、使用的验证方案。

知道了,这些之后,那么就很容易实现这个验证方法了,对吧? 以下是 CookieAuthentication 中间件中的核心类 CookieAuthenticationHandler 的里面的核心方法HandleAuthenticateAsync(),同样你可以理解为实现的 IAuthenticationHandler 接口的 AuthenticateAsync:

protected override async Task<AuthenticateResult> HandleAuthenticateAsync() { // 解析二维码 var result = await EnsureCookieTicket(); if (!result.Succeeded) { return result; } // 从二维码中拿当事人信息进行验证 var context = new CookieValidatePrincipalContext(Context, result.Ticket, Options); await Options.Events.ValidatePrincipal(context); if (context.Principal == null) { return AuthenticateResult.Fail("No principal."); } if (context.ShouldRenew) { RequestRefresh(result.Ticket); } // 验讫, 写入芯片 return AuthenticateResult.Success(new AuthenticationTicket(context.Principal, context.Properties, Options.AuthenticationScheme)); } HandleSignInAsync

我们故事继续……

奥巴马检票完成之后,把票就交给了小李,小李拿到票之后,导演又喊了一声:“ cut ”……

怎么又停了,小李和奥巴马一肚子的疑惑,导演说:“ 奥巴马呀,你检票员演的不错,还是继续扮演你的本职角色吧,演好了中午盒饭给你双份,小李,你来演检票员吧 ”。
可以吃两份盒饭了,奥巴马听后心里还是很开心。

“action” 导演喊了一声……

奥巴马接过票,向着车站里面的列车停车处走去,走到了列车门口要进去的时候,又出现了一个人,奥巴马知道,这个人就是做车内乘客登记的(ps: 一般情况下,做乘客登记都是在列车行驶的过程中,在这里我们假设这个做乘客登记的人比较勤快,就在车门口守着),登记完成之后就让奥巴马进去了。

那么,登记这个过程中都干了些什么呢?

首先,登记员的手持设备会解析火车票票里面写入芯片中的信息,发现没有问题,就开始向自己手里面的登记本登记信息了,主要包含车票主人信息,过期时间,审核人等。

这样整个过程就是 HandleSignInAsync 的一个过程,换成程序术语就是,组装 Cookie 登入上下文信息,写入到 Http 流的 header 中,也就写入到了客户端浏览器cookie。

至此,整个过程就完了,我们来看一下代码:

//方法里面的流程,我只列出了核心部分,影响阅读的全删了 protected override async Task HandleSignInAsync(SignInContext signin) { // 解析芯片中的信息 var result = await EnsureCookieTicket(); // 组织登入上下文,设置过期时间等 // 使用 data protected 加密登记本上的信息 var cookieValue = Options.TicketDataFormat.Protect(ticket); // 写入到浏览器header await ApplyHeaders(cookieValue); }

不想深入了解的可以忽略这部分内容:
在 HandleSignInAsync 这个函数的源码中,其中有一个很巧妙的设计, 就是 await Options.Events.SignedIn(signedInContext); 这样一句代码,干什么用的呢? 而且前后一共调用了两次,有同学知道是为什么吗? 我准备在下一篇中给出答案。

还记得前面 HttpContext 中的ClaimsPrincipal User吗? 就是小李临时顶替的那个角色,现在有值了,他就是是奥巴马了。

奥巴马在座位上坐好之后,经过6个小时的路程就从北京到杭州了,不得不佩服中国高铁的速度呀,在欣赏晚西湖的风景后,奥巴马给我们传来了一张照片:

iamge

至此,CookieAuthentication 中间件的整个工作流程已经讲完了,故事也结束了。

以上,就是这两行代码背后的故事:

var user = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, "奥巴马") }, CookieAuthenticationDefaults.AuthenticationScheme)); await HttpContext.Authentication.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, user); 总结

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • ASP.NET Core 之 Identity 入门(一) - Savorboard

    ASP.NET Core 之 Identity 入门(一) - Savorboard

    2016-11-07 15:00

  • ASP.NET Core love JavaScript - Savorboard

    ASP.NET Core love JavaScript - Savorboard

    2016-10-30 17:00

  • ASP.NET Core 性能对比评测(ASP.NET,Python,Java,NodeJS) - Savorboard

    ASP.NET Core 性能对比评测(ASP.NET,Python,Java,NodeJS) - Sav

    2016-10-20 10:00

  • ASP.NET Aries 4.0 开源发布:已完成基础功能优化重写 - 路过秋天

    ASP.NET Aries 4.0 开源发布:已完成基础功能优化重写 - 路过秋天

    2016-10-19 17:00

网友点评
h