基于策略的授权
定义可复用的授权策略。
基于策略的授权 是 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 反馈 — 无需本地设置。