在具体介绍使用方法前,我们需要先了解几个概念:

1,claim:英文翻译过来是声明的意思,一个claim包含Type,Value两项信息。我把claim理解成一个权限的定义,比如Type=会员,Value=删除操作

2,Identity:表示用户的身份信息,比如用户名

3,Principal:我理解成认证票据,里面包含identity,claim信息。

4,Policy:英文翻译过来是政策的意思,我理解的是权限验证的一个规则,就是当前我需要如何验证权限,比如要执行当前操作,必须具有会员删除操作的claim

5,角色:一组权限的集合

6,用户:一个使用系统的账户信息

理解什么是声明

声明(Claims)其实就是用户相关的一条一条信息的描述,这些信息包括用户的身份(如Name、Email、Country等)和角色成员,而且,它描述了这些信息的类型、值以及发布声明的认证方等。我们可以使用声明来实现基于声明的授权。声明可以从外部系统获得,当然也可以从本地用户数据库获取。

对于ASP.NET MVC应用程序,通过自定义AuthorizeAttribute,声明能够被灵活的用来对指定的Action 方法授权访问,不像传统的使用角色授权那么单一,基于声明的授权更加丰富和灵活,它允许使用用户信息来驱动授权访问。

既然声明(Claim)是一条关于用户信息的描述,最简单的方式来阐述什么是声明就是通过具体的例子来展示,这比抽象概念的讲解来的更有用。所以,我在示例项目中添加了一个名为Claims 的 Controller,它的定义如下所示:

  1. public class ClaimsController : Controller
  2. {
  3. [Authorize]
  4. public ActionResult Index()
  5. {
  6. ClaimsIdentity claimsIdentity = HttpContext.User.Identity as ClaimsIdentity;
  7. if (claimsIdentity == null)
  8. {
  9. return View("Error", new string[] {"未找到声明"});
  10. }
  11. else
  12. {
  13. return View(claimsIdentity.Claims);
  14. }
  15. }
  16. }

在这个例子中可以看出ASP.NET Identity 已经很好的集成到ASP.NET 平台中,而HttpContext.User.Identity 属性返回一个 IIdentity 接口的实现,而当与ASP.NET Identity 结合使用时,返回的是ClaimsIdentity 对象。

ClaimsIdentity 类被定义在System.Security.Claims 名称空间下,它包含如下重要的成员:

Claims

返回用户包含的声明对象集合

AddClaim(claim)

为用户添加一个声明

AddClaims(claims)

为用户添加一系列声明

HasClaim(predicate)

判断是否包含声明,如果是,返回True

RemoveClaim(claim)

为用户移除声明

当然ClaimsIdentity 类还有更多的成员,但上述表描述的是在Web应用程序中使用频率很高的成员。在上述代码中,将HttpContext.User.Identity 转换为ClaimsIdentity 对象,并通过该对象的Claims 属性获取到用户相关的所有声明。

一个声明对象代表了用户的一条单独的信息数据,声明对象包含如下属性:

Issuer

返回提供声明的认证方名称

Subject

返回声明指向的ClaimIdentity 对象

Type

返回声明代表的信息类型

Value

返回声明代表的用户信息的值

有了对声明的基本概念,对上述代码的View进行修改,它呈现用户所有声明信息,相应的视图代码如下所示:

  1. @using System.Security.Claims
  2. @using Users.Infrastructure
  3. @model IEnumerable<Claim>
  4. @{
  5. ViewBag.Title = "Index";
  6. }
  7. <div class="panel panel-primary">
  8. <div class="panel-heading">
  9. 声明
  10. </div>
  11. <table class="table table-striped">
  12. <tr>
  13. <th>Subject</th>
  14. <th>Issuer</th>
  15. <th>Type</th>
  16. <th>Value</th>
  17. </tr>
  18. @foreach (Claim claim in Model.OrderBy(x=>x.Type))
  19. {
  20. <tr>
  21. <td>@claim.Subject.Name</td>
  22. <td>@claim.Issuer</td>
  23. <td>@Html.ClaimType(claim.Type)</td>
  24. <td>@claim.Value</td>
  25. </tr>
  26. }
  27. </table>
  28. </div>

Claim对象的Type属性返回URI Schema,这对于我们来说并不是特别有用,常见的被用来当作值的Schema定义在System.Security.Claims.ClaimType 类中,所以要使输出的内容可读性更强,我添加了一个HTML helper,它用来格式化Claim.Type 的值:

  1. public static MvcHtmlString ClaimType(this HtmlHelper html, string claimType)
  2. {
  3. FieldInfo[] fields = typeof(ClaimTypes).GetFields();
  4. foreach (FieldInfo field in fields)
  5. {
  6. if (field.GetValue(null).ToString() == claimType)
  7. {
  8. return new MvcHtmlString(field.Name);
  9. }
  10. }
  11. return new MvcHtmlString(string.Format("{0}",
  12. claimType.Split('/', '.').Last()));
  13. }

有了上述的基础设施代码后,我请求ClaimsController 下的Index Action时,显示用户关联的所有声明,如下所示:

转载于:https://www.cnblogs.com/dog12345/p/6961250.html

asp.net identity 基础概念篇-理解什么是声明相关推荐

  1. 一点一点学ASP.NET之基础概念——委托

    委托的概念 委托实际上是类(一个貌似函数一样的类),我们已经使用函数指针很多年了--函数指针也被称为过程类型,但是它们的实现都不是类.它们是单独的函数指针的简单实例.委托是包含这些功能的类,委托类通过 ...

  2. 【软件测试】基础-概念篇

    软件测试基础-概念篇 记录 - 慕课网 imooc 软件测试基础-概念篇 简介:系统介绍什么是软件测试,从软件测试的定义.原则以及测试阶段.测试模式.测试手段和测试类型分别详细说明软件测试中的各种测试 ...

  3. 一点一点学ASP.NET之基础概念——HttpModule

    原文地址为: 一点一点学ASP.NET之基础概念--HttpModule HttpModule -- 一点一点学ASP.NET 文野: 2006 年 8 月 9 日 星期三 上一篇:一点一点学ASP. ...

  4. 模型推理部署——基础概念篇

    模型推理部署--基础概念篇 训练(training)vs推理(inference) 训练是通过从已有的数据中学习到某种能力,而推理是简化并使用该能力,使其能快速.高效地对未知的数据进行操作,以获得预期 ...

  5. BlockChain:区块链技术基础概念综合理解——个人总结

    BlockChain:区块链技术基础概念综合理解--个人总结 目录 区块链的进阶与意义 1.区块链技术的进阶 2.区块链技术三大意义-传递价值.建立可信用环境.提高效率和降低成本 1.传递价值 2.建 ...

  6. C++面试题(一)——基础概念篇

    https://blog.csdn.net/worldwindjp/article/details/18909079 C++面试题--基础概念篇 唐璐 http://blog.csdn.net/wor ...

  7. Python+Dash快速web应用开发——基础概念篇

    作者:费弗里 来源:Python大数据分析 ❝本文示例代码与数据已上传至https://github.com/CNFeffery/DataScienceStudyNotes ❞ 1 简介 这是我的新系 ...

  8. 数据结构与算法——从零开始学习(一)基础概念篇

    系列文章 第一章:基础知识 第二章:线性表 第三章:栈和队列 第四章:字符串和数组 第五章:树和二叉树 第六章:图 第七章:排序算法 前言 数据结构:是指相互之间存在一种或多种特定关系的数据元素的集合 ...

  9. [转载] 网络游戏程序员须知 基础概念篇

    转载自:https://blog.csdn.net/rellikt/article/details/5878447 本文为作者原创或翻译,转载请注明,不得用于商业用途. 作者:rellikt@gmai ...

  10. Android Service的绑定 基础概念篇

    Creating a Bound Service 绑定Service的作用: 一个绑定的service(bound service)是客户端-服务器接口中的服务器. 绑定的service允许组件(比如 ...

最新文章

  1. Leetcode 4.28 Tree Easy
  2. Spring Boot 使用slf4j+logback记录日志配置
  3. SAP Hybris使用recipe进行安装时,是如何执行ant命令的?
  4. JS笔记:检测客户端(引擎、浏览器、平台、操作系统)
  5. spring3 常见异常解决
  6. 论文浅尝 | 通过阅读实体描述进行零样本的实体链接
  7. 大白话vue——slot的作用与使用
  8. SpringMVC Hello World
  9. java的三种流程控制语录_Java 流程控制语句
  10. 电路分析第三章 电容与电感
  11. linux ipv6修改为ipv4,Linux IPV6 转 IPV4
  12. 《蜗居》100句台词 血淋淋的经典
  13. 美团2020校招后台开发
  14. 如何查看ps图片中边框的背景颜色
  15. 如何看hbo_如何取消HBO Max订阅
  16. 【餐厅点餐平台|一】项目描述+需求分析
  17. CyclicBarrier多任务协同的利器
  18. 'localtime': This function or variable may be unsafe. Consider using localtime_s instead.
  19. 初中计算机word试题,初中计算机会考word试题WORD15
  20. 水印相机定位不准确怎么办_云联相机app下载-云联相机app安卓版下载v1.0.0

热门文章

  1. pythonplotting,Sympy and plotting
  2. 保龄球计分c语言程序,求C语言代码解释(保龄球记分程序)
  3. 专升本高数——第二章 一元函数的导数与微分【学习笔记】
  4. fastlane build 版本号自增
  5. Docker Secrets
  6. Flyway数据库版本管理工具
  7. 金凯瑞在马赫西管理大学毕业典礼的演讲
  8. anconda各个版本下载
  9. iPhone13再现粉屏问题,同时出现闪退/卡顿/重启?
  10. 实战游戏项目管理5-配置管理