.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. [freemarker篇]04.简单介绍-基本数据类型

    好几天没有更新博客了,最近一顿乱七八糟的忙!今天简单更新第四章,这里只能说是简单介绍,因为权威的还是需要看Freemarker的官方中文手册! 好几天没有更新博客了,最近一顿乱七八糟的忙!今天简单更新 ...

  2. ubuntu下规避终端打开gvim出现的错误

    在终端下面打开gvim会出现下面的错误: GLib-GObject-WARNING **: Attempt to add property GnomeProgram::display after cl ...

  3. Android achartengine统计图

    最近在安卓2.2上写个实时的监控程序,要用到统计图.从网上搜了下 Java4Less (http://java4less.com/charts/chart.php?info=android)     ...

  4. Matlab之矩阵

    1.新建矩阵 A = zeros(5,5); 2.矩阵赋值 A(:,j) = [5  5]表示取A矩阵的第j列全部元素 a.矩阵的同行元素之间用空格(或”,”)隔开: b.矩阵的行与行之间用”;”(或 ...

  5. 考上好大学,然后进入IT行业是穷人孩子晋级中产的唯一出路?

    今天看到一篇不错的文章,内容如下: 这个问题来自于我在知乎上参与的一个热贴讨论,作为一个10年的老码农,创业公司呆过,二.三流的互联网公司混过,BAT也遛了一趟,如今再次回归创业,经历算得上狗血了,看 ...

  6. asp.net解决高并发的方案. (转自网络)

    最近几天一直在读代震军的博客,他是Discuz!NT的设计者,读了他的一系列关于Discuz!NT的架构设计文章,大呼过瘾,特别是Discuz!NT在解决高访问高并发时所设计的一系列方案,本人尤其感兴 ...

  7. Oracle 学习笔记3:新建数据库没有scott用户解决办法

    新建一个数据库,若选择Oracle组件时,没有选择实例方案,完成后进行口令管理,默认列表中是找不到scott用户解锁的.若要解锁scott用户,可以进行如下操作: 使用system或者sys连接数据库 ...

  8. Activity生命周期-Android

    Activity常见的三种生命周期: 1.完整生命周期 oncreate-->onstart-->onresume-->onpause-->onstop-->ondest ...

  9. Android之adb命令

    1.安装APK(如果加 -r 参数,保留已设定数据,重新安装filename.apk) adb install xxx.apk adb install -r xxx.apk 2.卸载APK(如果加 - ...

  10. CSS之Document方法的使用

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...