ASP.NET Core 基于声明的访问控制到底是什么鬼?

本文涉及的产品
访问控制,不限时长
简介: 从ASP.NET 4.x到ASP.NET Core,内置身份验证已从基于角色的访问控制(RBAC)转变为基于声明的访问控制(CBAC)。

我们常用的HttpContext.User属性ASP.NET 4.0时代是IPrincipal类型,ASP.NETCore现在强化为ClaimsPrincipal类型。


cb93340ade306c93625ef65c7d5b053d.png


本文就一起来看看这难缠的、晦涩难懂的声明式访问控制。


1.Claims : 声明


声明是基于声明的身份验证(claims-based authentication)的基础,声明是某主题(Subject)的片段信息


声明是个名词,并不能说明主体可以做什么或不能做什么, 对应现实生活中各种卡片上体现的片段信息。


使用术语“主题”是因为声明不仅限于描述用户,声明可能与应用程序,服务或设备有关。


主题 Claim1 Claim2 Claim3 Claim3 Claim5 Claim6 Claim7 Claim8
身份证 身份证号 姓名 性别 籍贯 生日 签发机关 签发时间 过期时间
工作狗牌 姓名 级别 花名 身份证号 性别 base地区 入职时间 ---
王者荣耀 账号 游戏等级 大区 角色 氪金级别 年龄 注册时间 ---
微信 微信号 昵称 注册时间 国籍 实名证件 手机号 --- ---
车牌 车牌编号 车牌所属人 车牌地区 车牌性质 签发时间 签发机关 --- ---
某大保健会员卡 卡号 姓名 手机号 会员级别 办卡时间 办卡门店 --- ---


// 声明通过`System.Security.Claim`类表示
public class Claim {
  public string Type { get; }
  public string Value { get; }
  public string ValueType { get; }
  // some properties have been omitted.
}


对比可见:每个声明都有一个标识片段信息类型的Type属性、保存片段信息的Value属性、片段信息的数据类型。


var idClaim = new Claim(“Id”,“ 1”,“Integer”);        // 用户ID:整形
var dobClaim = new Claim(“dob”,“04/20/2000”,“Date”);  // 生日:事件类型
var emailClaim = new Claim(nameof(ClaimTypes.Name), mockUser.Email,nameof(ClaimValueTypes.String)),


2. Identities:身份


同一主题的声明组合在一起,称为ClaimsIdentity


对应现实生活中各种卡片:身份证、工作狗牌、车牌、大保健会员卡,均体现了某一个主题。


public class ClaimsIdentity {
  public string Name { get; }
  public IEnumerable<Claim> Claims { get; }
  public string AuthenticationType { get; }    // 保存使用的身份验证方法(Bearer、Basic)
  public bool IsAuthenticated { get; }
  // some properties have been omitted.
}


60b8f6cacf0cd045e9782466ddcc9819.png


假设某WebAPI可通过其唯一ID和名称来识别用户。验证从用户收到的承载令牌(JWT等)后,我们可以创建ClaimsIdentity来表示它们:


ClaimsIdentity userIdentity = new ClaimsIdentity(
  new Claim[] {
    new Claim("Id", "1"),
    new Claim("Username", "Bert")
  },
  "Bearer"
);
//userIdentity.IsAuthenticated == true since we passed "Bearer" as AuthenticationType.


3. Principals: 主体


ClaimsIdentity可以方便地表示一个主题(一组声明),很多时候一个主体有多个身份,就像现实生活中我们有个身份卡片,这个时候我们就需要钱包或者账号管理工具(1Passwowd、LassPass),将各种身份集中在一起就是主体ClaimsPrincipal


接上面的例子, 如果WebAPI需要确保访客使用的设备处于白名单,则可以对访客维护设备身份


ClaimsIdentity deviceIdentity = new ClaimsIdentity(
  new Claim[] {
    new Claim("IP", "192.168.1.1"),
    new Claim("Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
  }
);
//  针对访客设备声明,不要设置AuthenticationType


主体对象代表代码运行的用户的安全上下文,是各种有效身份的组合。


public class ClaimsPrincipal {
  public IEnumerable<Claim> Claims { get; }
  public IEnumerable<ClaimsIdentity> { get; }
  public ClaimsIdentity Identity { get; }
  public virtual IEnumerable<Claim> FindAll(Predicate<Claim> match);
  public virtual bool HasClaim(string type, string value);
  // ClaimsPrincipal提供了一些辅助方法/属性来检查声明.
}
 var principal = new ClaimsPrincipal(new IIdentity[] { userIdentity, deviceIdentity });


总结


基于声明的身份验证是WebApp获取它们需要的组织内部、其他组织以及Internet上的用户的身份信息的常用方法。它还为本地或云中运行的应用程序提供了一致的方法。基于声明的身份验证将身份和访问控制的各个元素抽象为两个部分:声明的概念以及颁发者或授权机构的概念。应用只有信任签发机构,才会认可用户信息。


  1. Claims: 身份信息的片段数据


  1. Identities:各种身份卡片


  1. Principals:主体,各种身份账户的集中存储地
相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
相关文章
|
1月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
1月前
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
29 1
|
2月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
2月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
92 3
|
1月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
2月前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
38 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
58 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
47 0
|
3月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?

热门文章

最新文章