[ASP.NET MVC] ASP.NET Identity登入技术剖析
[ASP.NET MVC] ASP.NET Identity登入技术剖析
前言
ASP.NET Identity是微软所贡献的开源项目,用来提供ASP.NET的验证、授权等等机制。本篇文章介绍ASP.NET Identity在执行登入功能时,与浏览器、还有第三方验证服务之间的运作流程。主要为自己留个纪录,也希望能帮助到有需要的开发人员。(本篇内容大幅度简化了ASP.NET Identity的运作细节,用以传达登入功能的运作概念。实际ASP.NET Identity在运作的时候,比本篇说明的复杂很多。)
Unauthorized(未登入)
当使用者使用浏览器,第一次进入ASP.NET站台。
因为还没有完成登入的动作,所以被ASP.NET判断为「未登入」。
这时使用者要求使用的资源,如果是被打上[Authorize]标签的Controller或是Action。[Authorize]标签会判别用户未登入,就回传HTTP 401状态代码。
ApplicationCookieMiddleware是一个Identity挂载到ASP.NET的Middleware,这个Middleware会去拦截HTTP 401状态代码。
ApplicationCookieMiddleware拦截到HTTP 401状态代码之后,会更改回传的内容。改为回传HTTP 302状态代码以及一个Login页面的URL。
浏览器接收到HTTP 302状态代码,会自动跳转页面到回传内容所夹带的Login页面URL。
ASP.NET站台会回传Login页面给浏览器,要求用户进行登入作业。
Authentication(验证)
使用者在Login页面,选择使用Facebook验证后,Login页面会连结到ExternalLogin这个Action。
ExternalLogin在收到使用者选择使用Facebook验证后,会回传一个ChallengeResult, 来引发Challenge。因为使用者是选择使用Facebook验证,所以这个Challenge动作会交由FacebookAuthenticationMiddleware来处理。
接着FacebookAuthenticationMiddleware会发起一个OAuth的流程,来在Facebook站台、用户浏览器之间交换信息,用以认证一个使用者。(参考数据:OAuth 2.0 笔记 - Yu-Cheng Chuang)
完成OAuth流程之后,FacebookAuthenticationMiddleware就可以依照取得的用户信息,来建立一个FBUser。
FBUser会被拿来做为SignIn动作的参数。这个SignIn动作,会被导到Identity挂载的ExternalCookieMiddleware去执行。
在ExternalCookieMiddleware里,会将FBUser编码为Cookie内容,并且附加到回传内容里。
完成SignIn动作后,FacebookAuthenticationMiddleware会更改回传的内容。改为回传HTTP 302状态代码、编码为Cookie内容的FBUser、以及一个ExternalLoginCallback URL。
Authorization(授权)
浏览器接收到HTTP 302状态代码,会自动跳转页面到回传内容所夹带的ExternalLoginCallback URL,并且也同时回传编码为Cookie内容的FBUser。
ASP.NET会从Cookie内容里译码出FBUser,并且依照编码FBUser为Cookie时的定义,将登入状态定义为「未登入」。
接着这个FBUser,会被提交给ASP.NET Identity,用以从Identity里取得系统使用的APPUser。这个APPUser除了用户相关数据外,也包含了授权给该用户的Role数据。
APPUser会被拿来做为SignIn动作的参数。这个SignIn动作,会被导到Identity挂载的ApplicationCookieMiddleware去执行。
在ApplicationCookieMiddleware里,会将APPUser编码为Cookie内容,并且附加到回传内容里。
完成SignIn动作后,ASP.NET Identity会更改回传的内容。改为回传HTTP 302状态代码、以及编码为Cookie内容的APPUser。
Authorized(已登入)
完成上述流程之后。使用者每次使用浏览器进入ASP.NET站台时,都会夹带编码为Cookie内容的APPUser。
ASP.NET会从Cookie内容里译码出APPUser,并且依照编码APPUser为Cookie时的定义,将登入状态定义为「已登入」。
使用者要求使用的资源,如果是被打上[Authorize]标签的Controller或是Action。[Authorize]标签会判别用户已登入,允许并执行功能内容。
ASP.NET站台执行执行功能内容后,会回传功能页面给浏览器。至此也就完成了,整个ASP.NET Identity登入的流程。
[ASP.NET MVC] ASP.NET Identity登入技术剖析的更多相关文章
- [ASP.NET MVC] ASP.NET Identity登入技术应用
[ASP.NET MVC] ASP.NET Identity登入技术应用 情景 ASP.NET Identity是微软所贡献的开源项目,用来提供ASP.NET的验证.授权等等机制.在ASP.NET I ...
- [ASP.NET MVC] ASP.NET Identity学习笔记 - 原始码下载、ID型别差异
[ASP.NET MVC] ASP.NET Identity学习笔记 - 原始码下载.ID型别差异 原始码下载 ASP.NET Identity是微软所贡献的开源项目,用来提供ASP.NET的验证.授 ...
- [Asp.net MVC]Asp.net MVC5系列——添加视图
目录 系列文章 概述 添加视图 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 概述 在这一部分我们添加一个新的控制器HelloWorldController类, ...
- [Asp.net MVC]Asp.net MVC5系列——在模型中添加验证规则
目录 概述 在模型中添加验证规则 自定义验证规则 伙伴类的使用 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5 ...
- [Asp.net MVC]Asp.net MVC5系列——添加模型
目录 概述 添加模型 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5系列——添加视图 概述 在本节中我们将追加 ...
- [Asp.net MVC]Asp.net MVC5系列——从控制器访问模型中的数据
目录 概述 从控制器访问模型中的数据 强类型模型与@model关键字 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net M ...
- [Asp.net MVC]Asp.net MVC5系列——添加数据
目录 概述 显示添加数据时所用表单 处理HTTP-POST 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5系列 ...
- [Asp.net MVC]Asp.net MVC5系列——布局视图
目录 系列文章 概述 布局视图 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5系列——添加视图 [Asp.net M ...
- Asp.net MVC]Asp.net MVC5系列——Routing特性
目录 概述 路由特性 使用路由 可选参数和参数的默认值 路由前缀 默认路由 路由约束 自定义路由约束 路由名 区域(Area) 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列— ...
随机推荐
- Android Fragment 使用技巧
1. Fragment 使用时要有一个无参构造函数 如果没有无参构造函数,而是像按照普通类来使用,只创建有参构造函数,则会出现 android.support.v4.app.Fragment$Inst ...
- SVN代码冲突解决方案小集合
对于刚接触svn的人来说,svn冲突后,不能提交是件让人很郁闷的事情.最让人郁闷的事,是代码间的覆盖.你把我代码盖了,我会很火大的.谁把谁的盖了都不爽. 为什么会出现代码冲突问题呢,因为不同的人,同时 ...
- Android之OptionsMenu与Notification的实现
OptionsMenu是Android提供的一种菜单方式,我们知道当智能机刚兴起时,手机上都会有一个MENU(菜单键),当我们点击时,默认我们打开Android提供的默认菜单,本篇我么就一起来学一下, ...
- 使用RequireJs和Bootstrap模态框实现表单提交
下面我将使用requirejs结合模态框实现三五行代码部署表单提交操作. 传统开发思路如下:
- Objective-C中的Block(闭包)
学习OC有接触到一个新词Block(个人感觉又是一个牛气冲天的词),但不是新的概念,不是新的东西.学过Javascript的小伙伴对闭包应该不陌生吧~学过PHP的应该也不陌生,在PHP5.3版本以后也 ...
- 1Z0-053 争议题目解析687
1Z0-053 争议题目解析687 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 687.Users are connected to a database instance th ...
- Winform在线更新
引言 2015年第一篇,Winform在线更新,算是重操旧业吧,09年刚到北京时一直做硬件联动编程,所以大多数时间都在搞Winform, 但是从来没做过在线更新这个功能,前几天参与部门另一个项目,上来 ...
- 浅尝ECMAScript6
浅尝ECMAScript6 简介 ECMAScript6 是最新的ECMAScript标准,于2015年6月正式推出(所以也称为ECMAScript 2015),相比于2009年推出的es5, es6 ...
- 【Python实战】Pandas:让你像写SQL一样做数据分析(二)
1. 引言 前一篇介绍了Pandas实现简单的SQL操作,本篇中将主要介绍一些相对复杂一点的操作.为了方便后面实操,先给出一份简化版的设备统计数据: 0 android NLL 387546520 2 ...
- https问答篇
https问答 SSL和TLS有什么区别? 可以说,TLS是SSL的升级版本,SSL是网景公司设计的,为了最早期的网络安全而生,它的全名叫做"安全套接层".后来,IETF在1999 ...