0Pricing
C# Academy · 课时

基于角色的授权

根据用户角色限制端点访问。

基于角色的授权 是 CoddyKit 上的免费 C# Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。

认证与授权

认证回答“您是谁?”。授权回答“您可以做什么?”。

ASP.NET Core 中最简单的授权模型是基于角色的模型:用户属于某些角色,而端点要求特定角色。

// User has roles: admin, editor
// Endpoint requires: admin

角色从何而来

角色只是一个类型为 ClaimTypes.Role 的声明。签发 JWT 时,请为用户拥有的每个角色添加一个角色声明。

var claims = new List<Claim>
{
    new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
    new Claim(ClaimTypes.Role, "admin"),
    new Claim(ClaimTypes.Role, "editor")
};

角色声明类型

要使 [Authorize(Roles=...)] 和 User.IsInRole 生效,处理程序必须知道哪个声明类型表示角色。

JWT 键 role 默认映射到 ClaimTypes.Role。如果您使用自定义键,请通过 RoleClaimType 告知验证器。

options.TokenValidationParameters = new TokenValidationParameters
{
    RoleClaimType = ClaimTypes.Role
};

要求单个角色

将 [Authorize(Roles = "admin")] 应用于控制器或操作。只有具有 admin 角色的用户才能进入。

[Authorize(Roles = "admin")]
[HttpDelete("users/{id}")]
public IActionResult DeleteUser(int id)
{
    // only admins reach here
    return NoContent();
}

要求多个角色中的任意一个

以逗号分隔的列表表示 OR:用户至少需要列出的角色之一。

[Authorize(Roles = "admin,editor")]
[HttpPut("articles/{id}")]
public IActionResult Update(int id) => Ok();
// admins OR editors are allowed

要求多个角色(AND)

若要要求用户拥有多个角色中的所有角色,请叠加多个 [Authorize] 特性。每个特性都必须通过。

[Authorize(Roles = "employee")]
[Authorize(Roles = "manager")]
public IActionResult ApproveBudget() => Ok();
// must be BOTH employee AND manager

在代码中检查角色

有时您需要在方法体内部进行角色检查,而不只是检查入口。请使用 User.IsInRole。

public IActionResult GetReport()
{
    var data = BuildReport();
    if (User.IsInRole("admin"))
        data.IncludeSensitiveColumns();
    return Ok(data);
}

Minimal API 等价写法

Minimal API 使用带内联策略的 .RequireAuthorization;或者更简单地说,您可以通过命名策略要求某个角色。

app.MapDelete("/users/{id}", (int id) => Results.NoContent())
   .RequireAuthorization(p => p.RequireRole("admin"));

层级中的角色

ASP.NET Core 没有内置的角色层级。如果管理员应自动拥有编辑者权限,您可以在登录时同时授予这两个角色声明,或者使用策略来建模(下一门课程会介绍)。

// Grant both at login if admin >= editor
new Claim(ClaimTypes.Role, "admin");
new Claim(ClaimTypes.Role, "editor");

角色不足以应对时

角色的粒度较粗。当规则取决于数据(例如“只有所有者才能编辑”)或需要细粒度权限时,角色检查会变得杂乱。

这正是基于声明和基于策略的授权发挥作用的地方。

// Hard to express with roles alone:
// "editors, but only for their own department"

返回 403 还是 401

如果用户未通过身份验证,角色检查会返回 401 Unauthorized。如果用户已通过身份验证但缺少相应角色,则会得到 403 Forbidden。

// No/invalid token         -> 401 Unauthorized
// Valid token, wrong role   -> 403 Forbidden

快速检查

测试您对角色的理解。

回顾

您学到了基于角色的授权:

  • 角色是放入令牌中的 ClaimTypes.Role 声明。
  • [Authorize(Roles = "a,b")] 表示 OR;叠加多个特性则表示 AND。
  • User.IsInRole 可在代码中检查角色。
  • 角色的粒度较粗——由数据驱动的规则需要更丰富的模型。

下一部分:基于声明的授权。

常见问题解答

「基于角色的授权」课时是免费的吗?

是的 — 「基于角色的授权」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。

「基于角色的授权」这节课中我会学到什么?

根据用户角色限制端点访问。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「基于角色的授权」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 基于角色的授权
  2. 基于声明的授权
  3. 基于策略的授权
  4. 自定义授权要求
← 返回 C# Academy