我将从CookieAuthenticationMiddleware中间件的使用,来讲述cookie认证是如何实现的

1、系统是如何调用CookieAuthenticationMiddleware的

在web.config的appSettings里添加<add key="owin:AppStartup" value="你自己的config类:namespace.class" >

public class IdentityConfig
{
public void Configuration(IAppBuilder app)
{
// 默认使用CookieAuthenticationMiddleware
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login")
});

}

在CookieAuthenticationExtensions里定义了默认的cookieAuthentication中间件

public static IAppBuilder UseCookieAuthentication(this IAppBuilder app, CookieAuthenticationOptions options, PipelineStage stage)
{
if (app == null)
{
throw new ArgumentNullException("app");
}
// 默认中间件
app.Use(typeof(CookieAuthenticationMiddleware), app, options);
app.UseStageMarker(stage);
return app;
}

2、主要class说明

CookieAuthenticationMiddleware:项目使用时调用的验证中间件类,下面简称 【cookieAuth中间件类】

AuthenticationMiddleware<CookieAuthenticationOptions>:CookieAuthenticationMiddleware的父类,下面简称 【Auth中间件类】

---下面说的是重点,实际的工作处理者--------

CookieAuthenticationHandler:【cookieAuth处理类】

AuthenticationHandler<TOptions>:泛型抽象类,主要有个方法Initialize。是CookieAuthenticationHandler的父类,下面简称 【Auth处理子类】。

AuthenticationHandler:抽象类,主要有BaseInitializeAsync和TeardownAsync方法,是AuthenticationHandler<TOptions>的父类,下面简称 【Auth处理基类】。

3、代码功能说明

public abstract class AuthenticationMiddleware<TOptions> : OwinMiddleware where TOptions : AuthenticationOptions
{
protected AuthenticationMiddleware(OwinMiddleware next, TOptions options) : base(next)
{
if (options == null)
{
throw new ArgumentNullException("options");
} Options = options;
} public TOptions Options { get; set; } // 具体的执行流程很简单,分为创建,初始化,下一个中间件执行,卸载
public override async Task Invoke(IOwinContext context)
{
//获取处理者,【cookieAuth处理类】
AuthenticationHandler<TOptions> handler = CreateHandler();
//初始化,会调用【Auth处理基类】的BaseInitializeAsync,具体查看---Initialize说明---
await handler.Initialize(Options, context);
if (!await handler.InvokeAsync())//默认返回false
{
//调用下一个中间件,比方说调用MVC中间件
await Next.Invoke(context);
}
// 最后执行,会调用【Auth处理基类】的TeardownAsync,具体说明查看---Teardown说明---
await handler.TeardownAsync();
} protected abstract AuthenticationHandler<TOptions> CreateHandler();
}

---Initialize说明---

初始化的时候,将获取已有的ticket,供后续的中间件使用

将调用【Auth处理基类】的BaseInitializeAsync来完成初始化

 protected async Task BaseInitializeAsync(AuthenticationOptions options, IOwinContext context)
{
_baseOptions = options;
Context = context;
Helper = new SecurityHelper(context);
RequestPathBase = Request.PathBase; _registration = Request.RegisterAuthenticationHandler(this);
// 设置响应事件,在teardown之后会执行
Response.OnSendingHeaders(OnSendingHeaderCallback, this); await InitializeCoreAsync();
// 主动模式时执行
if (BaseOptions.AuthenticationMode == AuthenticationMode.Active)
{
// 根据cookie得到ticket,判断是否需要renew,后续的中间件可以获取identity信息
AuthenticationTicket ticket = await AuthenticateAsync();
if (ticket != null && ticket.Identity != null)
{
// 将identity添加到context.Request.User里
Helper.AddUserIdentity(ticket.Identity);
}
}
}

---Teardown说明---

就是判断是否是登录,注销,renew,然后处理

登录:制作ticket写入cookie

注销:删除cookie

renew(剩余时长<使用时长):重新生成cookie的有效期

internal async Task TeardownAsync()
{
// 申请响应
// 判断是否是登录(IAuthenticationManager.SignIn),注销(IAuthenticationManager.SignOut),renew(_shouldRenew标志),然后处理
await ApplyResponseAsync();
// 默认返回null
await TeardownCoreAsync();
// request[key:Constants.SecurityAuthenticate],注销AuthenticationHandler,恢复成RegisterAuthenticationHandler之前的状态
Request.UnregisterAuthenticationHandler(_registration);
}

大致的流程就是这样,具体的如何判断登录,注销,下一章再详细讲解。

AspNet Katana中Authentication有关的业务逻辑的更多相关文章

  1. shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。

    shell脚本?在说什么是shell脚本之前,先说说什么是shell. shell是外壳的意思,就是操作系统的外壳.我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包 ...

  2. MyBatis知多少(6)表现层与业务逻辑层

    表现层 表现层负责向最终用户展示应用程序的控制方式以及数据.它还要负责所有信息的布局和格式.今天,商业应用程序最流行的表现方式应该算是Web前端了,它使用HTML和JavaScript并通 过Web浏 ...

  3. AngularJS之使用控制器封装业务逻辑

    AngularJS之使用控制器封装业务逻辑 控制器的作用 我们知道,在AngularJS中,实现数据绑定的核心是scope对象.那么控制器又有什么用呢? 简单地说,没有控制器/controller,我 ...

  4. 在 ASP.NET 中创建数据访问和业务逻辑层(转)

    .NET Framework 4 当在 ASP.NET 中处理数据时,可从使用通用软件模式中受益.其中一种模式是将数据访问代码与控制数据访问或提供其他业务规则的业务逻辑代码分开.在此模式中,这两个层均 ...

  5. 从App业务逻辑中提炼API接口

    2.1 从App业务逻辑中提炼API接口 业务逻辑思维导图 功能-业务逻辑思维导图 基本功能模块关系 功能模块接口UML(设计出API) 在设计稿标注API 编写API文档 2.2 设计API的要点 ...

  6. 在 Laravel 5 中使用 Repository 模式实现业务逻辑和数据访问的分离

    1.概述 首先需要声明的是设计模式和使用的框架以及语言是无关的,关键是要理解设计模式背后的原则,这样才能不管你用的是什么技术,都能够在实践中实现相应的设计模式. 按照最初提出者的介绍,Reposito ...

  7. 用适配器模式处理复杂的UITableView中cell的业务逻辑

    用适配器模式处理复杂的UITableView中cell的业务逻辑 适配器是用来隔离数据源对cell布局影响而使用的,cell只接受适配器的数据,而不会与外部数据源进行交互. 源码: ModelCell ...

  8. java中异常处理机制 throw抛出自定义业务逻辑异常 throws继续抛出 catch捕获后会自动继续抛向调用方法

    package com.swift; public class Exception_TestC { public static void main(String[] args) { /* * 第5题: ...

  9. SpringBoot自定义异常,优雅解决业务逻辑中的错误

    概要 你是不是在为业务逻辑中出现的异常弄的焦头烂额,常常在后台报错,前端却无法提示错误内容,导致用户体验极差?比如下单失败,前端只能提示下单失败,但是却不知道为什么失败,是库存不足,还是余额不足,亦或 ...

随机推荐

  1. git中报错---fatal: pathspec 'readme.txt' did not match any files

    1.git安装 git官网下载最新版本,一键安装或custom install. 2.会弹出一个类似的命令窗口的东西,就说明Git安装成功. 3.安装完成后,还需要最后一步设置,在命令行输入如下--- ...

  2. LeetCode 3: 无重复字符的最长子串 Longest Substring Without Repeating Characters

    题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. Given a string, find the length of the longest substring withou ...

  3. IT兄弟连 HTML5教程 CSS3揭秘 CSS3概述

    对于Web开发者来说,CSS3不只是一门新奇的技术,更重要的是这些全新概念的Web应用给开发人员带来了无限的可能性,也极大地提高了开发效率.我们不必再依赖图片或者JavaScript去完成圆角.多背景 ...

  4. 在windows桌面上创建一个文件夹

    用dos命令创建 md [文件路径][文件名] C:\Users\admin>md  C:\Users\admin\desktop\test 刷新一下桌面,就可以看见桌面上创建了一个名为test ...

  5. Tomcat9+JDK 13报错Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program

    Tomcat使用的是https://tomcat.apache.org/download-90.cgi Tomcat9 之前安装的JDK 13,有JAVA_HOME环境变量地址(C:\Program ...

  6. 利用Python进行数据分析-Pandas(第二部分)

    上一个章节中我们主要是介绍了pandas两种数据类型的具体属性,这个章节主要介绍操作Series和DataFrame中的数据的基本手段. 一.基本功能 1.重新索引 pandas对象的一个重要方法是r ...

  7. NXP恩智浦VEGA织女星开发板免费申请!

    前言 大概两周前申请了一块NXP恩智浦的开发板,今天终于收到了!在这里推荐给大家,官方网站刚上线一个月左右,目前申请的人还不算多,感兴趣的朋友可以申请一个,体验一下这个四核性能怪兽.大厂就是大气,包装 ...

  8. .NET Core 实现 腾讯云云解析简单客户端

    一.说明 腾讯云的.NET SDK虽然非常强大,但是对他的产品支持不是很完全,域名的云解析就没有SDK,所以自己写了一个,初衷是用来做动态DNS的,也准备接入多个云厂商,但是我自己本身仅仅只有腾讯云这 ...

  9. Python 关于 pip 部分相关库的安装

    下文中“:”后面安装的安装语句需要打开 cmd (命令提示符),在 cmd 中输入. 示例: 在搜索框输入 cmd,单机命令提示符: 然后输入安装语句,按回车键: 因为我之前已经装过了,所以这里显示的 ...

  10. Elasticsearch 6.x版本全文检索学习之聚合分析入门

    1.什么是聚合分析? 答:聚合分析,英文为Aggregation,是es除搜索功能外提供的针对es数据做统计分析的功能.特点如下所示: a.功能丰富,提供Bucket.Metric.Pipeline等 ...