如何在.NET Core 5中为匿名用户创建授权策略
实现匿名用户匹配授权策略的两种方案
方案1:内置断言快速实现(无需额外定义类,适合简单场景)
直接在策略配置中使用RequireAssertion方法编写判断逻辑即可,代码如下:
public static void AddAuthorizationAndPolicies(this IServiceCollection services) { services.AddAuthorization(options => { // 已登录用户策略 options.AddPolicy("IsLoggedIn", policy => policy.RequireAuthenticatedUser()); // 管理员用户策略 options.AddPolicy("IsAdminUser", policy => policy.RequireRole("Admin")); // 匿名用户策略 - 直接通过断言判断 options.AddPolicy("IsAnonymousUser", policy => policy.RequireAssertion(context => !context.User.Identity.IsAuthenticated)); }); }
方案2:自定义授权要求(适合需要复用逻辑、后续扩展判断规则的场景)
需要分三步实现:
- 自定义授权要求标记类,实现
IAuthorizationRequirement接口
public class AnonymousOnlyRequirement : IAuthorizationRequirement { // 仅作为策略标记,无需额外实现属性或方法 }
- 实现对应的授权处理器
public class AnonymousOnlyHandler : AuthorizationHandler<AnonymousOnlyRequirement> { protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AnonymousOnlyRequirement requirement) { // 验证用户未登录即为匿名用户 if (!context.User.Identity.IsAuthenticated) { context.Succeed(requirement); } else { context.Fail(); } return Task.CompletedTask; } }
- 注册处理器并配置策略
public static void AddAuthorizationAndPolicies(this IServiceCollection services) { // 注册自定义授权处理器 services.AddSingleton<IAuthorizationHandler, AnonymousOnlyHandler>(); services.AddAuthorization(options => { // 已登录用户策略 options.AddPolicy("IsLoggedIn", policy => policy.RequireAuthenticatedUser()); // 管理员用户策略 options.AddPolicy("IsAdminUser", policy => policy.RequireRole("Admin")); // 匿名用户策略 - 添加自定义要求 options.AddPolicy("IsAnonymousUser", policy => policy.AddRequirements(new AnonymousOnlyRequirement())); }); }
注意事项
如果使用该策略控制登录、注册等仅匿名用户可访问的接口,不要同时添加[AllowAnonymous]特性,该特性会跳过所有授权校验,导致策略失效。
内容的提问来源于stack exchange,提问作者MRB
相关产品推荐
相关产品推荐

