ASP.NET Core WebAPI条件式授权:满足条件免验证,否则走默认授权
实现ASP.NET Core WebAPI动态切换授权机制
我想要在ASP.NET Core WebAPI中实现这样的功能:当满足特定条件时,授权自动通过;条件不满足时,则使用默认的授权机制。参考相关方案后,我编写了如下授权处理器代码:
public class AuthDisableOrEnableHandler : AuthorizationHandler<AuthDisableOrEnableRequirement> { protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AuthDisableOrEnableRequirement requirement) { if (<condition>) { context.Succeed(requirement); } else { // 回退到默认授权行为 } return Task.CompletedTask; } }
举个实际场景:条件满足时,用户无需在HTTP请求头中携带Token即可调用接口;条件不满足时,用户必须携带合法Token才能访问接口。
2023年7月24日更新
感谢Corey Sutton的解答与评论,我已成功实现该功能。具体步骤如下:
- 让
NoAuthHandler继承自AuthenticationHandler<AuthenticationSchemeOptions>,而非直接实现IAuthenticationHandler接口。 - 重写
HandleAuthenticationAsync方法,创建合法的凭证票证,返回AuthenticateResult.Success(authTicket)。 - 在Program.cs中实现
GetAuthenticationSchemeBasedOnCondition()方法,满足条件时返回字符串"NoAuth",否则返回JwtBearerDefaults.AuthenticationScheme。
步骤1和2对应的代码如下:
public class NoAuthHandler : AuthenticationHandler<AuthenticationSchemeOptions> { private HttpContext _context; public NoAuthHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock) { } protected override Task<AuthenticateResult> HandleAuthenticateAsync() { string randomName = RandomNumberGenerator.GetInt32(100000, 999999).ToString(); // 仅用于测试,实际场景请替换为合理逻辑 var principal = new ClaimsPrincipal( new ClaimsIdentity( Scheme.Name, nameType: randomName, roleType: "Test") ); var authTicket = new AuthenticationTicket(principal, Scheme.Name); return Task.FromResult(AuthenticateResult.Success(authTicket)); } }
步骤3对应的代码如下:
string GetAuthenticationSchemeBasedOnCondition() { var condition = true; if(condition == true) // 此处替换为实际判断条件 { return "NoAuth"; } return JwtBearerDefaults.AuthenticationScheme; }
内容的提问来源于stack exchange,提问作者Librapulpfiction
相关产品推荐
相关产品推荐

