本来想直接就开始介绍Identity的部分,奈何自己挖坑太深,高举高打的方法不行。只能自己默默下载了Katana的源代码研究了好一段时间。发现要想能够理解好用好Identity, Claims是一个绕不过的内容。今天就和大家一起分享一下什么是Claims以及为什么Identity要基于Claims.

阅读目录:

一. 什么是Claims以及基于Claims的identity验证

二. 使用基于Claims的Identity验证的优势

三. Claims是如何应用在Asp.net中?

四,一些更深入的补充说明

一,什么是Claims以及基于Claims的identity验证

实际上,基于Claims的identity验证早已经被应用到我们生活中的很多方面。一个非常典型的例子就是我们到机场登机的过程。我们乘坐飞机,是不能够直接直接拿着机票和身份证就上飞机的,需要先到柜台上领登机牌. 到了指定柜台上,出示身份证和机票,办理物品托运,选好座位,确认后,才能换取登机牌。这个时候你才能凭借登机牌过安检和上飞机。

登机过程中,工作人员扫一下这个小小的登机牌,就能获取到很多信息: 比如,你已经是经过航空公司认证过的乘客,你的航班号,座位号,你的名字等。工作人员只要核对这些信息,就会允许你上对应的飞机和指定的座位。

以Claims的角度重新看待登机过程

OK. 我们再来捋一捋这个过程,用Claims的角度来重新描述和整理一下。

首先Claim就是一个描述. 这个例子中, 包含在登机牌上的一个一个信息,就是一个一个Claim. 这些Claims是这样的:

乘客的名字叫Justrun

乘坐的航班是MF8858

座位号是34J

............................

所有上面的Claims就组成了Identity, 也就是登机牌。这个登机牌是基于Claims的。

这个登机牌是经过航空公司的工作人员验证后,发给我的,那么发行者航空公司就是Issuer。

登机的时候,工作人员看到你的登机牌就会放行的原因是, 他信任这些Claims, 因为这些Claims的Issuer是trust的(航空公司)。比对完这些Claims,如果你登机的航班正确,就会让你登机。

二,使用基于Claims的Identity验证的优势

看起来上面的过程好像非常麻烦,不是吗? 为什么不就拿着身份证和机票直接登机,不是更加方便乘客吗?

它的好处就是简单的隔离了验证(Authentication)和授权(authorization)两个部分,但这也是它最大的优势。

想想看,如果我们没有了登机牌会是一个什么景象。工作人员要在飞机门口摆上设备,验证你的机票和身份证信息,给你办理行李托运,然后让你选座位........ 简直就不可想象。

有了登机牌, 验证就由航公公司来做,航空公司负责验证和发放登机牌,空姐就只需要查看你的登机牌,让你登机并决定你有没有权限座头等舱。

有了Claims Identity, 那么创建Claims Identity就可以由多种多样的验证过程来做,比如可以通过用户名密码,Active Direcity, 第三方登录(Google, Facebook,QQ,微博等),而我们的程序就主要根据Claims Identity来判断用户是否能够使用我们的系统,以及决定用户可以使用和不能使用系统中的那些功能。

这样,验证就完全和应用程序分开,开发应用程序的时候,只要我们使用的是基于Claims的Identity验证,就不用担心以后验证方式的的扩展和修改。

三,Claims是如何应用在Asp.net中?

在Visual Studio 2013中,创建一个Asp.net MVC项目。这个默认的Asp.net MVC项目中,权限验证默认使用的是CookieAuthentication。

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});

启动网站,能够看到常规的登录注册流程。当我们要访问受保护的页面的时候,会转到登录页面上。

现在我们在这个默认的MVC项目中做个小试验,不通过注册,登录,直接写入伪造的Claims信息来通过验证。

首先,我们在ManageController上,添加一个ProtectedPage页面,由于ManageController整个Controller都添加上了[Authorize],所以默认ProtectedPage是需要登录之后才能访问的。

public async Task<ActionResult> ProtectedPage()
{
return new ContentResult { Content = "This is a protected Page" };
}

直接敲入网址,http://localhost:4572/Manage/ProtectedPage , 和我们的预期一样,直接转到了登录页面。

接下来,是我们的重头戏,我们将给自己伪造Claims, 骗过Authentication, 获得访问ProtectedPage的权限。

在HomeController上,创建一个AddClaim页面,伪造Claims的过程如下:

public ActionResult AddClaim()
{
var claims = new List<Claim>//创建我们的Claim
{
new Claim(ClaimTypes.Name, "Peter"),
new Claim(ClaimTypes.Email, "justrun_test@outlook.com")
};
var identity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);//构建ClaimsIdentity
var ctx = Request.GetOwinContext();
var authenticationManager = ctx.Authentication;//通过OWIN Context获取我们的Authentication Manager
authenticationManager.SignIn(identity);
return Content("Login Success");
}

  访问AddClaims页面,看看效果。

我们的AddClaims起到效果了,通过人为的添加Claims信息,我们顺利的得到了访问ProtecedPage的权限。

四,一些更深入的补充说明

1. AuthenticationMiddleware如何判断用户是否是合法用户的?

ClaimIdentity相当于是登机牌,也就是我们的系统的通行证。构建的ClaimIdentity,最后会通过加密的方式,转换成加密字符,保存到Cookie中。Authentication中间层会通过检查用户Cookie中是否有ClaimIdentity,来判断当前访问的用户是否是合法用户。

2. 谁是Issuer?

在上面的例子中,Issuer就是我们自己,在AddClaims Action中,我们直接构造了CliamIdentity. 如果使用传统的用户名,密码登陆的方式的话,当验证通过,也是同样构造ClaimIdentity, 只是上面的例子中,我们跳过了这步。

在Katana中,还有FacebookAuthenticationMiddleware, GoogleAuthenticationMiddleware等实现,它们是Issuer就分别是Facebook和Google. 以FacebookAuthenticationMiddleware为例子,当FacebookAuthenticationMiddleware检查Cookie,发面没有ClaimIdentity,就会转到Facebook,要求提供Facebook账号信息。当用户登录Facebook账号,同意授权给我们的站点该用户Facebook信息。这个时候FacebookAuthenticationMiddleware根据这些信息,构造CliamIdentity。

3. 补充阅读:

想更多的了解OWIN以及Katana,可以看看下面这些文章

OWIN产生的背景以及简单介绍

Katana介绍以及使用

OWIN Middleware

了解更多细节,可以直接down源码:

Katana源码: https://katanaproject.codeplex.com/SourceControl/latest#README

Asp.net Identity源码: https://github.com/aspnet/Identity/tree/dev/src/Microsoft.AspNet.Identity

全新的membership框架Asp.net Identity(2)——绕不过的Claims的更多相关文章

  1. 全新的membership框架Asp.net Identity(1)——.Net membership的历史

    在Asp.net上,微软的membershop框架经历了Asp.net membership到Asp.net simple membership,再到现在的Asp.net Identity. 每一次改 ...

  2. 全新的membership框架Asp.net Identity

    在Asp.net上,微软的membershop框架经历了Asp.net membership到Asp.net simple membership,再到现在的Asp.net Identity. 每一次改 ...

  3. 全新的membership框架Asp.net Identity——绕不过的Claims

    http://www.cnblogs.com/JustRun1983/p/4708176.html?utm_source=tuicool&utm_medium=referral

  4. 框架Asp.net Identity

    框架Asp.net Identity 在Asp.net上,微软的membershop框架经历了Asp.net membership到Asp.net simple membership,再到现在的Asp ...

  5. Migrating an Existing Website from SQL Membership to ASP.NET Identity

    Migrating an Existing Website from SQL Membership to ASP.NET Identity public class User : IdentityUs ...

  6. 微软的权限框架Asp.Net Identity

    Asp.Net Identity 深度解析 之 注册登录的扩展   关于权限每个系统都有自己的解决方案,今天我们来讨论一下微软的权限框架Asp.Net Identity ,介绍如下  http://w ...

  7. 从Membership 到 .NET4.5 之 ASP.NET Identity

    我们前面已经讨论过了如何在一个网站中集成最基本的Membership功能,然后深入学习了Membership的架构设计.正所谓从实践从来,到实践从去,在我们把Membership的结构吃透之后,我们要 ...

  8. [转]Membership 到 .NET4.5 之 ASP.NET Identity

    本文转自:http://www.cnblogs.com/jesse2013/p/membership-part3.html 我们前面已经讨论过了如何在一个网站中集成最基本的Membership功能,然 ...

  9. MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN

    在Membership系列的最后一篇引入了ASP.NET Identity,看到大家对它还是挺感兴趣的,于是来一篇详解登录原理的文章.本文会涉及到Claims-based(基于声明)的认证,我们会详细 ...

随机推荐

  1. DDD 领域驱动设计-“臆想”中的实体和值对象

    其他博文: DDD 领域驱动设计-三个问题思考实体和值对象 DDD 领域驱动设计-三个问题思考实体和值对象(续) 以下内容属于博主"臆想",如有不当,请别当真. 扯淡开始: 诺兰的 ...

  2. 小菜学习Winform(六)剪切板和拖放复制

    前言 在做winform项目的时候有时候会用到复制粘贴,在.net中提供了Clipboard类来操作剪切板,我们来看下. clipbrd.exe clipbrd是系统剪切板程序,但是在vista及以上 ...

  3. [c++] Callable Objects

    Five kinds of callable objects: Functions Pointers to functions Objects of a class that overloads () ...

  4. 1Z0-053 争议题目解析501

    1Z0-053 争议题目解析501 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 501.Note the output of the following query; SQL&g ...

  5. Nancy之Forms authentication的简单使用

    一.前言 想必大家或多或少都听过微软推出的ASP.NET Identity技术,可以简单的认为就是一种授权的实现 很巧的是,Nancy中也有与之相类似的技术Authentication,这两者之间都用 ...

  6. ActiveX(二)Js 监听 ActiveX中的事件

    在上一篇随笔:ActiveX(一)第一个简单的Demo 中,已经可以实现 js 单向调用 ActiveX 中的方法,在很多情况下ActiveX中的方法的执行时相对耗时.耗性能的.在这样的情况下.Act ...

  7. EF架构~EF异步改造之路~仓储接口的改造~续

    回到目录 返回异步与并行目录 在写完仓储接口的改造改造后,总觉得有个代码的坏味道,这种味道源于它的DRP,即重复的代码太多了,即异步操作和同步操作其实只是在insert,update和delete上有 ...

  8. Andriod小项目——在线音乐播放器

    转载自: http://blog.csdn.net/sunkes/article/details/51189189 Andriod小项目——在线音乐播放器 Android在线音乐播放器 从大一开始就已 ...

  9. 【Java每日一题】20161209

    package Dec2016; public class Ques1209 { public static void main(String[] args){ People g = new Peop ...

  10. android studio 1.0 开发 ndk 调用 c++ so库

    一个没用过java和安卓的人使用android studio开发带c++ so库的安卓程序用例(以ndk的hello-jni为例),对于不熟悉java和安卓的人来说这个很花时间,希望通过这篇文章帮助跟 ...