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

如何在ServiceStack中为几乎所有请求配置强制认证(除指定资源)

集中式实现ServiceStack ERP系统全局认证(豁免指定路径)

嘿,这个需求太常见了,完全不用逐个给DTO或路由加[Authenticate]特性,ServiceStack提供了两种简洁的集中式方案,轻松实现“除指定请求外全部需认证”的效果:

方案一:利用AuthFeature内置配置(最推荐,代码最少)

如果你已经配置了AuthFeature,直接通过它的IgnorePaths属性就能指定豁免的路径,还支持通配符匹配静态资源目录,非常省心。

示例代码

在你的AppHost的Configure方法里修改AuthFeature的配置:

Plugins.Add(new AuthFeature(() => new CustomUserSession(),
    new IAuthProvider[] {
        new CredentialsAuthProvider() // 替换成你实际用的认证提供者
    }) {
        // 未认证用户访问受限资源时,重定向到登录页面
        HtmlRedirect = "/login",
        // 配置不需要认证的路径,支持通配符
        IgnorePaths = {
            "/login",                  // 登录页面路由
            "/favicon.ico",            // 网站图标
            "/css/*",                  // 所有CSS资源
            "/images/*",               // 所有图片资源
            "/js/*",                   // 所有JS资源
            "/auth/credentials"        // 凭证认证接口(如果用的是默认路由)
        }
    });

说明

  • IgnorePaths支持通配符(比如/css/*会匹配所有/css/下的子路径),不用逐个列举静态文件
  • 配置后,所有不在IgnorePaths里的请求(包括API接口、静态页面、DTO路由)都会自动要求用户认证
  • 未认证用户访问受限资源时,会自动重定向到你指定的/login页面

方案二:全局请求过滤器(更灵活,支持复杂逻辑)

如果你需要更复杂的豁免规则(比如根据DTO类型、请求方法、用户角色等判断),可以用全局请求过滤器来实现自定义逻辑。

示例代码

同样在AppHost的Configure方法里添加全局过滤器:

GlobalRequestFilters.Add((req, res, dto) =>
{
    // 1. 定义豁免的具体路径
    var exemptExactPaths = new HashSet<string>
    {
        "/login",
        "/favicon.ico",
        "/auth/credentials"
    };

    // 2. 匹配静态资源后缀
    var isStaticResource = req.PathInfo.EndsWith(".css") || 
                           req.PathInfo.EndsWith(".png") || 
                           req.PathInfo.EndsWith(".jpg") ||
                           req.PathInfo.EndsWith(".js");

    // 3. 匹配目录级别的豁免(比如/css/下所有资源)
    var isExemptDirectory = req.PathInfo.StartsWith("/css/") || 
                            req.PathInfo.StartsWith("/images/");

    // 4. 特殊DTO豁免(如果有个别API不需要认证)
    var isExemptDto = dto is PublicDataRequestDto;

    // 如果属于豁免范围,跳过认证检查
    if (exemptExactPaths.Contains(req.PathInfo) || isStaticResource || isExemptDirectory || isExemptDto)
        return;

    // 检查用户是否已认证,未认证则重定向或返回401
    if (!req.IsAuthenticated)
    {
        // 针对网页请求重定向到登录页
        if (req.IsHtmlRequest())
        {
            res.Redirect("/login");
        }
        // 针对API请求返回401 Unauthorized
        else
        {
            res.StatusCode = (int)HttpStatusCode.Unauthorized;
            res.EndRequest();
        }
    }
});

说明

  • 可以根据实际需求扩展豁免逻辑,比如判断请求方法(req.Method)、用户IP等
  • 同时支持网页和API请求的不同处理方式(重定向 vs 返回401)
  • 对于DTO的豁免,直接判断dto的类型即可,不用给DTO加任何特性

两种方案都能实现你要的集中式认证控制,推荐优先用方案一,因为它是ServiceStack内置的配置,代码更少,也更符合框架的设计思路。如果有特殊的复杂规则,再考虑方案二的全局过滤器。

内容的提问来源于stack exchange,提问作者jklemmack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:45:22