0Pricing
C# Academy · 课时

基于策略的授权

定义可复用的授权策略。

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

策略模型

在 ASP.NET Core 中,每一次授权检查最终都会通过一个策略执行。角色和声明特性只是简写形式,后台仍会构建策略。

定义命名策略可以集中管理规则,并让控制器保持简洁。

[Authorize(Policy = "CanManageOrders")]

AddAuthorization

使用 AddAuthorization 在服务容器中注册策略。每个策略都会获得一个唯一名称。

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("CanManageOrders", policy =>
        policy.RequireRole("admin", "sales"));
});

RequireAuthenticatedUser

最基本的要求就是用户已登录。RequireAuthenticatedUser 会拒绝匿名调用者。

options.AddPolicy("SignedIn", policy =>
    policy.RequireAuthenticatedUser());

组合要求

策略构建器可以链式添加多个要求;只有当所有要求都通过时,策略才会成功。

options.AddPolicy("SeniorEditor", policy =>
    policy
        .RequireAuthenticatedUser()
        .RequireRole("editor")
        .RequireClaim("seniority", "senior"));

默认策略

不带参数的 [Authorize] 使用默认策略,而默认情况下它只要求用户通过身份验证。您可以替换此策略。

options.DefaultPolicy = new AuthorizationPolicyBuilder()
    .RequireAuthenticatedUser()
    .RequireClaim("email_verified", "true")
    .Build();

回退策略

回退策略适用于完全没有授权特性的终结点——这是实现默认安全的一种强大方式。

options.FallbackPolicy = new AuthorizationPolicyBuilder()
    .RequireAuthenticatedUser()
    .Build();
// Now every endpoint requires auth unless marked [AllowAnonymous]

使用 AllowAnonymous 选择退出

当回退策略锁定所有内容时,请使用 [AllowAnonymous] 暴露登录或运行状况检查等公共终结点。

[AllowAnonymous]
[HttpGet("health")]
public IActionResult Health() => Ok("healthy");

将策略应用到终结点

可以在特性或 Minimal API 扩展中按名称引用策略。

// Controller
[Authorize(Policy = "SeniorEditor")]
public IActionResult Publish() => Ok();

// Minimal API
app.MapPost("/publish", () => Results.Ok())
   .RequireAuthorization("SeniorEditor");

对终结点进行分组

将策略应用到整个路由组,这样其中的每个终结点都会继承该策略。

var admin = app.MapGroup("/admin")
               .RequireAuthorization("CanManageOrders");

admin.MapGet("/stats", () => Results.Ok());
admin.MapDelete("/{id}", (int id) => Results.NoContent());

要求的内部机制

每次调用 Require* 都会向策略添加一个 IAuthorizationRequirement。匹配的处理程序会评估每个要求。对于内置要求,这是自动完成的;自定义规则则需要自定义处理程序(下一课介绍)。

// RequireRole("admin") adds a RolesAuthorizationRequirement
// RequireClaim(...) adds a ClaimsAuthorizationRequirement

在哪里定义策略

将所有策略定义放在一个扩展方法中,以便于查找和测试。

public static IServiceCollection AddAppPolicies(
    this IServiceCollection services)
{
    services.AddAuthorization(o =>
    {
        o.AddPolicy("SignedIn", p => p.RequireAuthenticatedUser());
        o.AddPolicy("CanManageOrders", p => p.RequireRole("admin"));
    });
    return services;
}

快速检查

测试您对默认策略和回退策略的理解。

回顾

您学到了基于策略的授权:

  • AddPolicy 定义命名且可复用的规则。
  • RequireAuthenticatedUser、RequireRole 和 RequireClaim 以 AND 语义组合。
  • DefaultPolicy 为不带参数的 [Authorize] 提供支持;FallbackPolicy 保护未标记的终结点。
  • [AllowAnonymous] 可以选择退出。

下一部分:自定义授权要求和处理程序。

常见问题解答

「基于策略的授权」课时是免费的吗?

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

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

定义可复用的授权策略。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

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

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

「基于策略的授权」课时需要多长时间?

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

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

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

此课程中的所有课时

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