ASP.NET Core中Policy、Scheme及Policy Scheme的区别与关联解析
ASP.NET 认证/授权中 Policy、Scheme、Policy Scheme 概念解析
1. 认证方案(Scheme)
Scheme 是具体的认证实现方式,相当于身份验证的"工具"。比如 Cookie 认证、JWT 令牌认证、OAuth2 第三方登录,每种方式对应一个独立的 Scheme。每个 Scheme 背后都有一套认证处理器,负责验证用户提交的凭证(比如Cookie值、Bearer令牌),并生成包含用户身份信息的 ClaimsPrincipal 对象。
你可以给每个Scheme起个自定义名称,比如:
services.AddAuthentication() .AddJwtBearer("MyJwt", options => { /* JWT配置 */ }) .AddCookie("MyCookie", options => { /* Cookie配置 */ });
这里的 "MyJwt" 和 "MyCookie" 就是两个不同的认证Scheme名称。
2. 授权策略(Policy)
Policy 是授权规则的集合,用来判断某个用户是否有权限访问特定资源。它可以包含多种规则:检查用户是否有某个Claim、是否属于指定角色、是否满足自定义条件(比如年龄≥18)等。
关键的是,Policy 可以指定哪些认证Scheme的用户身份会被用来做规则校验。比如你可以定义一个仅接受JWT认证用户的管理员策略:
services.AddAuthorization(options => { options.AddPolicy("AdminOnly", policy => { // 指定该策略只认可"MyJwt" Scheme认证的用户 policy.AuthenticationSchemes.Add("MyJwt"); // 规则:必须拥有Admin角色 policy.RequireRole("Admin"); }); });
在接口/Controller上标注 [Authorize(Policy = "AdminOnly")],就会先通过"MyJwt" Scheme验证用户身份,再检查是否符合Admin角色要求。
3. Policy Scheme(策略方案)
Policy Scheme 是一种特殊的认证Scheme——它本身不做实际的身份验证,而是扮演"调度器"的角色,根据预设逻辑动态选择其他真实的认证Scheme来处理请求。
比如你想让系统根据请求头自动切换JWT或Cookie认证,就可以用Policy Scheme作为默认认证方案:
services.AddAuthentication("DefaultPolicyScheme") .AddJwtBearer("MyJwt", options => { /* 配置 */ }) .AddCookie("MyCookie", options => { /* 配置 */ }) .AddPolicyScheme("DefaultPolicyScheme", "动态认证", options => { options.ForwardDefaultSelector = context => { // 逻辑:如果请求头带Bearer令牌,用MyJwt;否则用MyCookie var authHeader = context.Request.Headers["Authorization"].FirstOrDefault(); return authHeader?.StartsWith("Bearer ") ? "MyJwt" : "MyCookie"; }; });
三者的关联逻辑
- Scheme是基础:所有认证的核心单元,提供身份验证的能力;
- Policy依赖Scheme:授权规则需要先通过指定的Scheme拿到用户身份,再执行规则校验;
- Policy Scheme是认证层面的调度器:它本身是一个Scheme,但不做实际认证,而是帮你在多个Scheme之间动态选择,也可以和授权Policy配合使用(比如让Policy接受Policy Scheme调度后的用户身份)。
内容的提问来源于stack exchange,提问作者dmdany07
相关产品推荐
相关产品推荐

