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的

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

Asp.net Security框架(1)的更多相关文章

  1. Asp.net Security框架(2)

    Asp.net 的Security框架除了提供Cookies,OAuth,ActiveDirectory等多个用户认证实现,基本上已经满足业务项目的开发需要了. 当需要实现OAuth2.0服务器端实现 ...

  2. ASP.NET Core 框架源码地址

    ASP.NET Core 框架源码地址 https://github.com/dotnet/corefx 这个是.net core的 开源项目地址 https://github.com/aspnet  ...

  3. 从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程

    从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程   用户登录与权限验证是网站不可缺少的一部分功能,asp.net MVC4框架内置了用于实现该功能的类库,只需要简单搭 ...

  4. 探索ASP.NET MVC框架之路由系统

    引言 对于ASP.NET MVC的路由系统相信大家肯定不陌生.今天我们就深入ASP.NET的框架内部来看一下路由系统到底是怎么通过我们给出的地址(例如:/Home/Index)解析出Controlle ...

  5. Asp.net MVC5 框架揭秘 S412 实例解析 – 绝妙的扩展 模式的胜利

    Asp.net MVC5 框架是个 开源的,处处可扩展的框架. 蒋先生 在他的这本书里 对如何理解框架,如何扩展框架, 给出了大量的说明和实例. 先上效果图 大部分做传统BS 的同学看到这个页面,脑海 ...

  6. 写自己的ASP.NET MVC框架(上)

    http://www.cnblogs.com/fish-li/archive/2012/02/12/2348395.html 阅读目录 开始 ASP.NET程序的几种开发方式 介绍我的MVC框架 我的 ...

  7. 学习“迷你ASP.NET MVC框架”后的小结

    看蒋老师MVC的书第二个大收获可以是算是看了这个迷你ASP.NET MVC框架了,虽然它远不如真正ASP.NET MVC(下文简称“MVC”)那么复杂庞大,但在迷你版中绕来绕去也够呛的.这部分我看了几 ...

  8. 如何用asp.net MVC框架、highChart库从sql server数据库获取数据动态生成柱状图

    如何用asp.net MVC框架.highChart库从sql server数据库获取数据动态生成柱状图?效果大概是这样的,如图: 请问大侠这个这么实现呢?

  9. BrnShop开源网上商城第二讲:ASP.NET MVC框架

    在团队设计BrnShop的web项目之初,我们碰到了两个问题,第一个是数据的复用和传递,第二个是大mvc框架和小mvc框架的选择.下面我依次来说明下. 首先是数据的复用和传递:对于BrnShop的每一 ...

随机推荐

  1. jasper打印文件出现空白页面

    EG:打印文件结果打印出一片空白 原因:使用了null的数据源而不是JREmptyDataSource 以下为正确代码 public <T> List<JasperPrint> ...

  2. python的os模块fnmatch模块介绍

    一.先介绍一下os模块 import os print(os.getcwd()) # E:\python\test\python_models # 获取当前的目录 print(os.listdir(& ...

  3. 轻量级富文本编辑器wangEditor

    开发公司一个系统的时候需要一个富文本编辑器,找了几个,最后选择这个,蛮不错的. 百度搜索wangEditor,进入官网根据所介绍的使用进行开发就可以了,很不错的一个工具.

  4. docker mysql 主主同步

    转发自:https://blog.csdn.net/money9sun/article/details/85099134 第一步:安装docker   https://www.cnblogs.com/ ...

  5. mongod.service: control process exited, code=exited status=1

    Cent OS 7上需要把mongoDB添加到systemd,否则会出现上面的错误 将mongoDB添加到systemd # vim /usr/lib/systemd/system/mongod.se ...

  6. celery 应用

    开启服务 #日志 级别 celery -A write_file worker -l info file name :write_file.pyfrom celery import Celery ce ...

  7. VBA实现表单自动编号

    效果:每次提交或刷新标段,表单案指定格式实现自动编号.如当天日期加数字编号的格式 即 2019年2月3日产生的第一张表单产生的编号格式为20190203-001 以此类推第二张表单编号为2019020 ...

  8. springmvc webservlet 加redis 订阅消息

    由于项目内请求的数据需要 等待设备处理完毕后返回才能得到.请求命令返回的是发送成功的包,而不是设备处理的包,所以需要请求等待.. 方式一:项目中 添加了redis作为一个缓存, webservlet ...

  9. Python实现对CSV文件的读写功能

    我们要处理csv文件,首先要的导入csv模块 import csv #读取csv文件def readCsv(path): #传入变量csv文件的路径 list=[] #定义一个空列表 with ope ...

  10. mybatis学习笔记1.零碎记录

    1.conf.xml文件中的一些标签先后顺序会有影响. conf.xml文件<configuration>标签对里面配置的<typeAliases>标签的位置还有讲究?我将其放 ...