如何在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
相关产品推荐
相关产品推荐

