Security框架主要用于身份认证的,基本上所有Asp.net项目有意或者无意的都在使用的,框架的源码包含在Katana项目下。

最常见的使用方式或许就是SignIn来给客户端浏览器生成包含身份信息的Cookie了,在Cookie的有效期内所有对Web网站的访问都会携带这样的Cookie,被CookieMiddleware解析出身份信息并设置到HttpContext的User属性上。

我认为Security框架核心就两个类

1.AuthenticationMiddleware

将身份认证模块添加到应用程序的处理管道中,配置Options参数

2.AuthenticationHandler

真正处理身份认证的逻辑代码,当发起登录操作的时候会创建经过加密的身份信息Token以及每次Request请求到来时提取Token信息解析出对应的ClaimsIdentity

在AuthenticationMiddleware的Invoke方法中会获取一个对应的AuthenticationHandler实例,比如CookieAuthenticationHandler,其AuthenticateCoreAsync方法被执行,在方法体中,会尝试获取存放身份信息的Cookie,并解析出AuthenticationTicket实例,如果Token未过期那么就会返回这样一个AuthenticationTicket实例,最后其Identity属性将会被设置到HttpContext的User属性上,在验证的过程中可以通过配置Options的Provider(类型为ICookieAuthenticationProvider)来添加扩展,自定义决定是否成功返回AuthenticationTicket。

当我们熟悉上述两个类的源码,基本上身份认证的整体逻辑就了解的差不多了,另外我们真实项目中常用的还有一个OwinContext的类型为IAuthenticationManager的属性--Authentication,常用的是它的SignIn,SignOut,Challenge三个方法,它们本身的执行逻辑是很简单的就是将相应的参数信息保存起来,AuthenticationHandler会调用Response.OnSendingHeaders来注册一个返回Response信息前的执行逻辑,在这个执行逻辑中会分别尝试获取SignIn,SignOut,Challenge三个方法调用时所保存的参数信息。

1.在OnSendingHeaders的执行逻辑中如果判断出SignIn被执行了那么会获取到SignIn的AuthenticationTicket,调用TicketDataFormat的Protect方法将AuthenticationTicket序列化为字符串后设置到Cookie上,返回Response。在这个执行过程中Security框架为我们提供了一些扩展点,我们可以修改AuthenticationTicket的数据。

2.如果执行过SignOut,那么OnSendingHeaders的执行逻辑会尝试删除上一步所创建的包含身份信息的Cookie,并执行一条Redirect语句跳转到StartUp类中配置的LoginPath,同样也提供了扩展点方便使用者修改参数。

3.如果执行过Challenge,那么OnSendingHeaders的执行逻辑中判断得到Response.StatusCode为401,同时LoginPath存在数据,那么就会执行Redirect语句跳转到LoginPath

有一点需要注意如果配置了Token过期时间,并且SlidingExpiration为true(默认为true),同时request请求发生时尚未超时,那么Token会被renew的

(纯粹是为了下个月找工作而准备的一系列博文,每一篇都尽量精简,并非给初学者看的☺)

最新文章

  1. linux中字体的安装以及Terminal字体重叠问题解决
  2. windows下React-native 环境搭建
  3. 编程中Foo, Bar 到底什么意思?
  4. SQL入门语句之运算符
  5. Discuz! X3.1直接进入云平台列表的方法
  6. .net网站能走多远
  7. 1.servlet的会话机制cookie
  8. Python3批量爬取网页图片
  9. 基于MVVM的知乎日报应用安卓源码
  10. 源码心德`Context`类
  11. JSP中使用的模式——JSP+JavaBean
  12. (转载)vsftpd简易配置
  13. 40. Testing Prev Part IV. Spring Boot features
  14. DirectFB 之 字体显示
  15. C语言的输入输出操作函数小结
  16. windows下postgresql安装失败解决方法:无法运行getlocales.exe
  17. Netty_TCP拆包粘包解决方案
  18. [Codeforces Round #516][Codeforces 1063B/1064D. Labyrinth]
  19. Cookie Session 与Token
  20. map的实际操作用并for_each遍历

热门文章

  1. Unity3d项目入门之虚拟摇杆
  2. P3865 【模板】ST表
  3. grid布局
  4. gulp打包普通项目
  5. linux学习第十四天 (Linux就该这么学)找到一本不错的Linux电子书
  6. java idea导入ecli项目
  7. Python学习笔记:基础
  8. EmWin 字体相关函数
  9. IEC2017级_1-2班2次博客作业成绩说明
  10. 对TIMIT数据进行格式转换(SPHERE2WAV(RIFF))