[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系列— ...
随机推荐
- sublime text 下的Markdown写作
sublime text 2(3)下的Markdown写作 什么是 Markdown wiki Markdown 是一种方便记忆.书写的纯文本标记语言,用户可以使用这些标记符号以最小的输入代价生成极富 ...
- MySQL GROUP BY用法
背景介绍 最近在设计数据库的时候因为开始考虑不周,所以产生了大量的重复数据.现在需要把这些重复的数据删除掉,使用到的语句就是Group By来完成.为了进一步了解这条语句的作用,我打算先从简单入手. ...
- 3.用Redis Desktop Manager连接Redis
Redis Desktop Manager是Redis图形化管理工具,方便管理人员更方便直观地管理Redis数据. 然而在使用Redis Desktop Manager之前,有几个要素需要注意: 一. ...
- 轻量级前端MVVM框架avalon - 执行流程2
接上一章 执行流程1 在这一大堆扫描绑定方法中应该会哪些实现? 首先我们看avalon能帮你做什么? 数据填充,比如表单的一些初始值,切换卡的各个面板的内容({{xxx}},{{xxx|html}}, ...
- canvas学习笔记一
为了研究pixi库,就顺带从头到位学习下canvas吧 判断支持力度 var webgl = (function() { try { var canvas = document.createEleme ...
- Power BI官方视频(2) Power BI嵌入到应用中的3种方法
今天给大家介绍3种将Power BI嵌入到应用中的方法. 本文原文地址:Power BI官方视频(2) Power BI嵌入到应用中的3种方法 Power BI系列文章地址:微软Power BI技术文 ...
- 引用类型-RegExp类型
JavaScript高级程序设计(第三版)笔记-第五章-RegExp类型 定义正则表达式有两种方式 1.用字面量形式定义正则表达式: ver expression = /patterns/flags; ...
- 可惜Java中没有yield return
项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...
- MyCAT实现MySQL的读写分离
在MySQL中间件出现之前,对于MySQL主从集群,如果要实现其读写分离,一般是在程序端实现,这样就带来一个问题,即数据库和程序的耦合度太高,如果我数据库的地址发生改变了,那么我程序端也要进行相应的修 ...
- mac+php+xdebug+phpstorm在苹果下配置xdebug一波三折
1.下载xdebug文件 http://xdebug.org/wizard.php 将phpinfo()的源代码复制到文本框中,xdebug会提示如何配置和下载哪个版本的xdebug. 全部下载地址: ...