基于角色的授权
根据用户角色限制端点访问。
基于角色的授权 是 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 反馈 — 无需本地设置。