owin 中间件 katana 如何解密cookie
.NET MVC5 默认的用户登录组件是AspNet.Identity ,支持owin,并且微软自己实现的一套owin 中间件叫 katana
补充一下 katana项目源码地址:https://katanaproject.codeplex.com/
如何用owin做用户登录 授权等这里就不详细说了,大家可以自行搜索。
登录就有用户状态,用户状态一般就是保存在cookie 里,cookie里肯定是保存的加密串了。
那么这个katana是如何解密跟加密呢?
翻了大半天源码,终于找到核心的2个类 CookieAuthenticationMiddleware,CookieAuthenticationHandler
引用一下这篇比较全的文章,
作者最后说下回分解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的更多相关文章
- 使用Owin中间件搭建OAuth2.0认证授权服务器
前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...
- [2014-11-11]使用Owin中间件搭建OAuth2.0认证授权服务器
前言 这里主要总结下本人最近半个月关于搭建OAuth2.0服务器工作的经验.至于为何需要OAuth2.0.为何是Owin.什么是Owin等问题,不再赘述.我假定读者是使用Asp.Net,并需要搭建OA ...
- OWIN与Katana详解
前言 我胡汉三又回来了,!!!!, 最近忙成狗,实在没空写博文,实在对不起自己,博客园上逛了逛发现 我大微软还是很给力的 asp.net core 1.0 .net core 1.0 即将发布,虽然. ...
- OWIN与Katana
OWIN与Katana详解 前言 我胡汉三又回来了,!!!!, 最近忙成狗,实在没空写博文,实在对不起自己,博客园上逛了逛发现 我大微软还是很给力的 asp.net core 1.0 .net c ...
- Owin中间件搭建OAuth2.0认证授权服务体会
继两篇转载的Owin搭建OAuth 2.0的文章,使用Owin中间件搭建OAuth2.0认证授权服务器和理解OAuth 2.0之后,我想把最近整理的资料做一下总结. 前两篇主要是介绍概念和一个基本的D ...
- 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 ...
- OWIN and Katana
OWIN(Open Web Interface for .NET)是在.net的web server和web应用之间定义了一套规范. Katana是微软实现了OWIN的一个Web Server的项 ...
- ASP.NET MVC5 学习笔记-4 OWIN和Katana
1. Owin OWIN全名:Open Web Interface for .NET. 它是一个说明,而非一个框架,该声明用来实现Web服务器和框架的松耦合.它提供了模块化.轻量级和便携的设计.类似N ...
- OWIN and Katana - 1
翻译自 http://www.asp.net/aspnet/overview/owin-and-katana/an-overview-of-project-katana 十多年来,基于ASP.NET框 ...
随机推荐
- HDU 1875 畅通工程再续 (最小生成树)
畅通工程再续 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- codeforces 677D D. Vanya and Treasure(二维线段树)
题目链接: D. Vanya and Treasure time limit per test 1.5 seconds memory limit per test 256 megabytes inpu ...
- nginx二级域名配置
CentOs下nginx二级域名配置 域名配置文件 命名规则:XXX.域名信息.conf 配置文件路径:etc/nginx/conf.d/xxxx.conf 配置文件内容:server { liste ...
- WinDbg配置与下载 (转载)
WinDbg配置和使用基础 WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件. 1. Win ...
- C# Winform里面用Console.WriteLine输出到哪了
C# Winform里面用Console.WriteLine输出也不会报错 显示在 VS IDE 的视图→输出窗口,且只在 Debug 环境下此语句执行. 如果是 Release 环境,在 Win32 ...
- 理解JavaScript设计模式与开发应用中发布-订阅模式的最终版代码
最近拜读了曾探所著的<JavaScript设计模式与开发应用>一书,在读到发布-订阅模式一章时,作者不仅给出了基本模式的通用版本的发布-订阅模式的代码,最后还做出了扩展,给该模式增加了离线 ...
- javaScript之 变量、作用域和内存问题
<javaScript高级程序设计>第四章 读书笔记 4.1 基本类型 和 引用类型 的值 1. 基本类型值 包括:Undefined.Null.Boolean.Number 和 St ...
- path 环境变量
path(环境变量)是dos以前的内部命令,windows继续沿用至今.用作运行某个命令的时候,本地查找不到某个命令或文件,会到这个声明的目录中去查找.一般设定java的时候为了在任何目录下都可以运行 ...
- MD5加密方式
MD5加密是一种安全系数比较高的加密方式,具有不可逆的加密特征,就是很难进行破解,现在对MD5加密进行破解的方式还是采用跑数据库的方式,时间比较长,耗费性能比较大,所以一般的破解都是要收费的. C#中 ...
- mysql快速上手2
上一篇文章讲的是mysql的基本操作,这一篇会有一点难以理解,本节主要内容mysql视图,存储过程,函数,事务,触发器,以及动态执行sql 视图view 视图是一个虚拟表,其内容由查询定义.同真实的表 ...