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框 ...
随机推荐
- Mac和Linux下测试端口是否存活一法[转载]
测试端口存活的最常用的方法是telnet $telnet 127.0.0.1 80 不过这个方法有一个不方便的地方:连接成功后会进入交互模式,需要按 ctrl + ] 和 q 才能退出. 后来,经过网 ...
- 初识 Asp.Net内置对象之Session对象
Session对象 Session对象用于存储在多个页面调用之间特定用户的信息.Session对象只针对单一网站使用者,不同的客户端无法相互访问.Session对象中止联机机器离现时,,也就是当网站使 ...
- Sharepoint 2013 安装部署系列篇 第三篇 -- 安装和配置网络负载均衡在前端web服务器
第一部分 系统集群安装 第二部分 SQL集群安装 第四部分 安装和配置sharepoint 场(三层拓扑部署) 接下来一步一步开始配置NLB吧, 以下开始讲解如何配置NLB集群作为sharepoint ...
- asp.net mvc @RenderBody()的问题
在使用.net mvc 母版页布局时如果是进行上中下三块布局的话,那么就会像下面的图那样: 在上面的div 和下面的div之间会出现4cm的间隔, 解决如下: 给包裹@RenderBody()的div ...
- asp.net从一个页面的单击按钮事件控制另一个页面的刷新
分步说(比如你的三个页面分别为main.aspx; left.aspx;right.aspx,且点击left.aspx页面的button,则right.aspx刷新): 1. 在父页面main.asp ...
- jquery 导航固定的一个实例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- java使用BufferedImage和Graphics实现图片合成
package com.igoxin.weixin.custom; import java.awt.Graphics; import java.awt.image.BufferedImage; imp ...
- BeanDefinition的Resource定位
1.以编程的方式使用DefaultListableBeanFactory时,首先定义一个Resource来定位容器使用的BeanDefiniton.这时使用的是ClassPathResource,这意 ...
- 7款外观迷人的HTML5/CSS3 3D按钮特效
1.CSS3超酷3D弹性按钮 按钮实现非常简单 今天我又要向大家分享一款实现超级简单的CSS3 3D弹性按钮,它在鼠标按下时不仅从视觉上感受到3D立体的效果,而且更有弹性的动画特效,非常可爱. 在线演 ...
- 将mysql的查询结果输出到文件
在sql命令中我们可以查询到前数行的表,同时也可以将查询结果输出到txt文档 语句:select * from tablename into outfile 'filename.txt'; 例如:se ...