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:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
相关文章
|
15天前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
37 5
|
2月前
|
存储 开发框架 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月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
42 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
23天前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
26 3
|
2月前
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
36 1
|
2月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
开发框架 前端开发 .NET
ASP.NET Core 核心特性学习笔记「下」
ASP.NET Core 核心特性学习笔记「下」
|
开发框架 前端开发 中间件
ASP.NET Core 核心特性学习笔记「上」
ASP.NET Core 核心特性学习笔记「上」
|
SQL 机器学习/深度学习 Cloud Native
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
- 状态 - 自动变更检测 - 不查询删除和更新 - 并发
255 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
|
SQL Cloud Native 架构师
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记
- 关联数据加载 - 客户端与服务端运算 - 跟踪与不跟踪 - 复杂查询运算 - 原生 SQL 查询 - 全局查询筛选器
249 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记