You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core自定义认证中如何识别AllowAnonymous路由并处理SSO校验

解决方案:基于IAsyncAuthorizationFilter实现SSO Cookie校验及AllowAnonymous绕过

一、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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 05:06:42