.NET Core自定义认证中如何识别AllowAnonymous路由并处理SSO校验
一、IAsyncAuthorizationFilter的触发时机说明
这个过滤器的触发阶段是路由匹配完成、Action绑定结束后,Action方法执行前,且在UseAuthentication中间件执行之后,UseAuthorization中间件的内置校验逻辑之前。此时HttpContext.User已被身份认证中间件初始化,同时可以通过AuthorizationFilterContext拿到当前Action的元数据(包括AllowAnonymousAttribute),完全符合你的需求场景。
它和内置的AuthorizeAttribute属于同一类型过滤器,触发时机一致,优先级高于ActionFilter、ResultFilter等其他类型过滤器。
二、具体实现代码
1. 自定义Authorization过滤器
public class SsoCookieAuthorizationFilter : IAsyncAuthorizationFilter { public async Task OnAuthorizationAsync(AuthorizationFilterContext context) { // 检查当前Action或Controller是否标记了AllowAnonymous var hasAllowAnonymous = context.ActionDescriptor.EndpointMetadata .Any(metadata => metadata is AllowAnonymousAttribute); if (hasAllowAnonymous) { // 存在匿名允许标记,直接放行 return; } // 检查SSO Cookie是否存在 var ssoCookie = context.HttpContext.Request.Cookies["YourSsoCookieName"]; if (string.IsNullOrWhiteSpace(ssoCookie)) { // 无SSO Cookie,重定向到登录页 context.Result = new RedirectResult("/Account/Login"); return; } // 可选:如果需要校验SSO Cookie的有效性,在此调用SSO服务接口验证 // var isValid = await ValidateSsoTokenAsync(ssoCookie); // if (!isValid) // { // context.Result = new RedirectResult("/Account/Login"); // return; // } } }
2. 注册过滤器
有两种注册方式,按需选择:
- 全局注册:对所有Controller和Action生效,在
Startup.cs的ConfigureServices中配置:
services.AddControllersWithViews(options => { options.Filters.Add<SsoCookieAuthorizationFilter>(); });
- 局部注册:仅对指定Controller或Action生效,直接用特性标记:
// 对整个Controller生效 [TypeFilter(typeof(SsoCookieAuthorizationFilter))] public class DashboardController : Controller { // ... } // 对单个Action生效 public class HomeController : Controller { [TypeFilter(typeof(SsoCookieAuthorizationFilter))] public IActionResult SecurePage() { // ... } }
三、和身份认证/授权中间件的执行顺序
UseAuthentication:先执行,负责解析请求中的身份凭证(比如Cookie、Token),并将用户信息填充到HttpContext.User,但不做权限校验。- 自定义
SsoCookieAuthorizationFilter:在UseAuthentication之后触发,此时可以安全检查SSO Cookie,同时通过ActionDescriptor判断是否需要绕过校验。 UseAuthorization:执行内置的授权规则(比如AuthorizeAttribute的角色/策略校验),和自定义过滤器属于同一阶段,两者可以配合使用(比如先过SSO Cookie校验,再做角色权限校验)。
四、为什么不选择AuthenticationHandler?
AuthenticationHandler的核心职责是验证身份凭证并生成ClaimsPrincipal,它的执行时机在路由匹配完成之前,此时无法获取到具体的ActionDescriptor,也就没法判断当前请求是否指向AllowAnonymous的端点,因此不适合你的需求场景。而Authorization过滤器正好处于路由匹配完成的阶段,能拿到Action的元数据,完美适配你的校验逻辑。
内容的提问来源于stack exchange,提问作者kkdeveloper7
相关产品推荐
相关产品推荐

