0Pricing
C# Academy · 课时

基于声明的授权

根据用户声明进行授权。

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

超越角色

角色是声明的一种特殊情况。基于声明的授权可以检查任意声明——电子邮件、部门、订阅层级、权限标志等,而不仅仅是角色。

这样可以在不创建几十个角色的情况下实现更精细的控制。

// Claims a user might carry:
// department = sales
// subscription = pro
// email_verified = true

向令牌添加声明

请签发授权规则将要检查的各种声明。声明由类型和值组成。

var claims = new List<Claim>
{
    new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
    new Claim("department", "sales"),
    new Claim("subscription", "pro"),
    new Claim("email_verified", "true")
};

定义声明策略

基于声明的规则通过使用 AddAuthorization 注册的命名策略来表达。RequireClaim 要求用户拥有指定的声明。

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("VerifiedEmail", policy =>
        policy.RequireClaim("email_verified", "true"));
});

不指定值的 RequireClaim

如果您只关心声明是否存在(值可以是任意内容),只需传入类型来调用 RequireClaim。

options.AddPolicy("HasDepartment", policy =>
    policy.RequireClaim("department"));

指定允许值的 RequireClaim

您可以列出允许的值;只要声明与其中任意一个值匹配,策略就会通过。

options.AddPolicy("PaidTier", policy =>
    policy.RequireClaim("subscription", "pro", "enterprise"));

应用声明策略

在 [Authorize] 中按名称引用该策略。

[Authorize(Policy = "PaidTier")]
[HttpGet("premium-reports")]
public IActionResult Reports() => Ok();

Minimal API 用法

Minimal API 通过 RequireAuthorization 引用相同的策略名称。

app.MapGet("/premium-reports", () => Results.Ok())
   .RequireAuthorization("PaidTier");

组合多个声明要求

策略可以链式调用多个 RequireClaim;所有要求都必须满足(AND)。

options.AddPolicy("VerifiedSales", policy =>
    policy
        .RequireClaim("email_verified", "true")
        .RequireClaim("department", "sales"));

使用 RequireAssertion 实现自定义逻辑

当固定值检查不足以满足需求时,RequireAssertion 会对 ClaimsPrincipal 执行任意谓词。

options.AddPolicy("AdultUser", policy =>
    policy.RequireAssertion(ctx =>
    {
        var dob = ctx.User.FindFirst("birthdate")?.Value;
        return DateTime.TryParse(dob, out var d) &&
               d <= DateTime.UtcNow.AddYears(-18);
    }));

在运行时读取声明

在操作中,如果您需要的是声明值而不只是是或否的门槛,仍然可以直接检查声明。

var dept = User.FindFirst("department")?.Value;
var isPro = User.HasClaim("subscription", "pro");

声明与角色——何时使用哪一种

请使用角色表示宽泛的工作职能,使用声明表示属性和功能标志。两者可以组合——一个策略可以同时要求某个角色和多个声明。

options.AddPolicy("SalesManager", policy =>
    policy.RequireRole("manager")
          .RequireClaim("department", "sales"));

快速检查

确认您对声明策略的理解。

回顾

您学到了基于声明的授权:

  • 任何声明都可以用于控制访问,而不仅仅是角色。
  • RequireClaim 可以检查声明是否存在,或检查特定的允许值。
  • RequireAssertion 用于处理自定义谓词逻辑。
  • 声明和角色可以在同一个命名策略中组合。

下一部分:完整的基于策略的模型。

常见问题解答

「基于声明的授权」课时是免费的吗?

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

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

根据用户声明进行授权。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

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

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

「基于声明的授权」课时需要多长时间?

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

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

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

此课程中的所有课时

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