.NET MVC5 默认的用户登录组件是AspNet.Identity ,支持owin,并且微软自己实现的一套owin 中间件叫 katana

补充一下 katana项目源码地址:https://katanaproject.codeplex.com/

如何用owin做用户登录 授权等这里就不详细说了,大家可以自行搜索。

登录就有用户状态,用户状态一般就是保存在cookie 里,cookie里肯定是保存的加密串了。

那么这个katana是如何解密跟加密呢?

翻了大半天源码,终于找到核心的2个类 CookieAuthenticationMiddleware,CookieAuthenticationHandler

引用一下这篇比较全的文章,

http://www.cnblogs.com/jesse2013/p/aspnet-identity-claims-based-authentication-and-owin.html?utm_source=tuicool&utm_medium=referral

作者最后说下回分解CookieAuthenticationMiddleware这个东西,一直没等到下回,只能自己动手丰衣足食了。

CookieAuthenticationHandler 里面有2个方法

1,AuthenticateCoreAsync

2,ApplyResponseGrantAsync

前者是解密,后者是加密

我们直接看解密的

  protected override async Task<AuthenticationTicket> AuthenticateCoreAsync()
{
AuthenticationTicket ticket = null;
try
{
string cookie = Options.CookieManager.GetRequestCookie(Context, Options.CookieName);
if (string.IsNullOrWhiteSpace(cookie))
{
return null;
} ticket = Options.TicketDataFormat.Unprotect(cookie);
//这里省略 …………

Unprotect(cookie); 这个方法就是解密的核心方法了

查找引用 找到SecureDataFormat<TData> 这个类

 public TData Unprotect(string protectedText)
{
try
{
if (protectedText == null)
{
return default(TData);
} byte[] protectedData = _encoder.Decode(protectedText);
if (protectedData == null)
{
return default(TData);
} byte[] userData = _protector.Unprotect(protectedData);
if (userData == null)
{
return default(TData);
} TData model = _serializer.Deserialize(userData);
return model;
}
catch
{
// TODO trace exception, but do not leak other information
return default(TData);
}
}

这里我们可以看到,解密步骤分成了三个步骤

Decode(解码)
Unprotect(解除保护)
Deserialize(反序列化)

分别查看源码后发现
解码用的是 Base64 解保护用的windowsapi 里的CryptoAPI ,序列化用的是二进制序列化。 到这里我就停了,需要的知识已经搞清楚了。 那么我在项目里怎么解密呢? 我没有直接用CookieAuthenticationMiddleware这个类,这个依赖较多,也可能是我没全看懂,反正没直接用。
既然知道三个步骤是什么了,干脆我也是3个步骤了。
Decode(解码)用Base64UrlTextEncoder
Deserialize用TicketSerializer
这两个类都是public 的,并且直接new 就能用的。katana源码里也是用这两个类。
麻烦的地方在
Unprotect

需要在Startup里面通过IAppBuilder 来创建 IDataProtector 
不要问startup是什么,会用owin的都知道。
   public partial class Startup
{
public static IDataProtector dataProtector=null;
private ILog loger = LogManager.GetLogger(typeof (Startup));
public const string LoginCookieName = "xxx"; public void ConfigureAuth(IAppBuilder app)
{ var op = new CookieAuthenticationOptions
{
AuthenticationType = LoginCookieName,
LoginPath = new PathString("/Login")
//,ExpireTimeSpan = TimeSpan.FromHours(1)
,
ExpireTimeSpan = TimeSpan.FromDays()
,
SlidingExpiration = true };
app.UseCookieAuthentication(op);
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); dataProtector = app.CreateDataProtector(
typeof(CookieAuthenticationMiddleware).FullName,
op.AuthenticationType, "v1"); }
}

用了一个静态变量来装

dataProtector 

(直觉用静态变量不太好,有其他方案请不吝赐教啊)

那么真正实现解密cookie的地方就在某个Controller里
   public async Task<ActionResult> DeCodeUser(string cookie)
{ byte[] protectedData = new Base64UrlTextEncoder().Decode(cookie); byte[] data = Startup.dataProtector.Unprotect(protectedData);
var tick = new TicketSerializer().Deserialize(data);
string userid = tick.Identity.GetUserId();
AppUser currentUser = await UserManager.FindByIdAsync(userid);
return Json(currentUser);
}

只要传入这个需要解密的cookie就能获取用户信息出来了。

当然这个主要是用来探讨怎么解密 cookie而已,真正你要获取用户信息,直接调用 controller 里User就可以了。

有人会担心,如果知道了解密方式,那岂不是只要cookie信息被截获 别人就能解出里面的信息?

当然不行,我写的这个例子是因为加密 跟解密的方法都在同一台机器上运行,所以所创建的

IDataProtector  其实包含着相同的密钥,相同的appname ,所以才能够加密解密对称。如果分开2台不同的机器就
应该不行了
(这个不太确定,如果知道了appname等信息不知道能不能模仿,但是还有winapi CryptoAPI 这个东西,底层实现我没细看,有心的读者可以去研究一下,记得把成果分享给我哟)。

 

owin 中间件 katana 如何解密cookie的更多相关文章

  1. 使用Owin中间件搭建OAuth2.0认证授权服务器

    前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...

  2. [2014-11-11]使用Owin中间件搭建OAuth2.0认证授权服务器

    前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...

  3. OWIN与Katana详解

    前言 我胡汉三又回来了,!!!!, 最近忙成狗,实在没空写博文,实在对不起自己,博客园上逛了逛发现 我大微软还是很给力的 asp.net core 1.0 .net core 1.0 即将发布,虽然. ...

  4. OWIN与Katana

    OWIN与Katana详解   前言 我胡汉三又回来了,!!!!, 最近忙成狗,实在没空写博文,实在对不起自己,博客园上逛了逛发现 我大微软还是很给力的 asp.net core 1.0 .net c ...

  5. Owin中间件搭建OAuth2.0认证授权服务体会

    继两篇转载的Owin搭建OAuth 2.0的文章,使用Owin中间件搭建OAuth2.0认证授权服务器和理解OAuth 2.0之后,我想把最近整理的资料做一下总结. 前两篇主要是介绍概念和一个基本的D ...

  6. Getting Started with OWIN and Katana(Console 代替iis 制作 web服务的简单方案)

    Open Web Interface for .NET (OWIN) defines an abstraction between .NET web servers and web applicati ...

  7. OWIN and Katana

      OWIN(Open Web Interface for .NET)是在.net的web server和web应用之间定义了一套规范. Katana是微软实现了OWIN的一个Web Server的项 ...

  8. ASP.NET MVC5 学习笔记-4 OWIN和Katana

    1. Owin OWIN全名:Open Web Interface for .NET. 它是一个说明,而非一个框架,该声明用来实现Web服务器和框架的松耦合.它提供了模块化.轻量级和便携的设计.类似N ...

  9. OWIN and Katana - 1

    翻译自 http://www.asp.net/aspnet/overview/owin-and-katana/an-overview-of-project-katana 十多年来,基于ASP.NET框 ...

随机推荐

  1. 关于使用Exception的一点心得

    毫无疑问,Exception有很多优点.查看任何一本面向对象的书籍,都会提到异常相对于返回值标记状态的不足以及避免错误导致程序崩溃的问题.看起来是很好的,用起来也是很好的.可是这么多年过去了,异常用的 ...

  2. 查看centos中的用户和用户组

    用户列表文件:/etc/passwd 用户组列表文件:/etc/group 查看系统中有哪些用户:cut -d : -f 1 /etc/passwd查看可以登录系统的用户:cat /etc/passw ...

  3. hdu 3585 二分+最大团

    题目:给出平面上n个点,现在找m个点,并且使得这m个点最近的两个最远. 分析:显然这满足二分的性质,二分答案,根据点距离需要大于等于二分值重新构造新图,则问题变成了:在新图中找出满足所有点对之间的距离 ...

  4. Angularjs 使用filter格式化输出href

    工作中,由于是多级菜单,如果上级菜单为空,就会访问Angularjs 默认的state,然后再展开菜单,我找资料之后,才知道是通过filter来格式化输出数据的,格式是{{ expression | ...

  5. Quartz.Net使用

    相关的Quartz的Demo https://yunpan.cn/cY3GZGcyTSQxu  访问密码 8b60 官方的写的也挺仔细的.http://www.quartz-scheduler.net ...

  6. MySQL防注入[待续]

    1.将输入的参数变成整数 $id = isset[$_GET['tid']]?$_GET['tid']+0:0; 可以防止:"*.php?tid=3 or 1"这样的语句.

  7. AndroidStudio开发工具快捷键

    在这里,自己整理了下在使用AndroidStudio开发工具所使用到的一些快捷键提示,也出于在开发过程中节省时间提升效率,然而可能多数开发者之前使用的都是Eclipse开发工具,可能开始都不习惯,但是 ...

  8. Java之ConnectionPool连接池

    1.初始化(根据配置信息进行初始化)2.产生一个新的数据库连接3.有存储已经使用的连接集合,空闲连接集合4.提供给外部调用获取连接的方法5.提供给外部释放连接(不是关闭连接,而是将连接闲置)6.销毁连 ...

  9. MySQL配置管理

    数据库的链接: 获取项目结果集和链接: package Dao; import java.sql.Connection; import java.sql.ResultSet; import java. ...

  10. if条件判断语句的不同

    let number = ["a":1, "b":2, "c":3]; if let num = number["d"] ...