我正在使用ServiceStack构建ERP并将身份验证连接并正常工作。但是,我想要在基本上每个路由,DTO或静态页面上要求身份验证 - 除了登录页面和支持资源(CSS,图像)。
有一种简单,集中的方式吗?我可以将[Authenticate]
应用于每个DTO /路线,但很容易错过一个。
如何对所有请求进行身份验证,请保存一些?我怀疑是某种形式的global request filter,但我不确定如何开始。
答案 0 :(得分:1)
是的,最简单的方法是使用Global Request Filter:
GlobalRequestFilters.Add((req, res, dto) => {
if (!req.IsAuthenticated())
{
res.StatusCode = (int) HttpStatusCode.Unauthorized;
res.EndRequest();
}
});
这将确保对所有服务请求进行身份验证,以验证ServiceStack处理的非服务请求已通过身份验证,您可以使用PreRequestFilters
代替:
PreRequestFilters.Add((req, res) => {
if (!req.IsAuthenticated())
{
res.StatusCode = (int) HttpStatusCode.Unauthorized;
res.EndRequest();
}
});
答案 1 :(得分:1)
@ mythz&#39的解决方案是最正确的,但在我的情况下,我有一些特定的额外标准,我原先没有问过。也就是说,我想允许Authenticate
个请求,并将用户重定向到登录页面。我使用的是自定义身份验证提供程序ServiceStack.Authentication.Azure,因此我最终使用303 Redirect而不是403 Fail(或者更合适的是401 Unauthorized),以使其与我的OAuth样式提供程序一起使用。
this.GlobalRequestFilters.Add((req, res, requestDto) =>
{
if (!req.IsAuthenticated() && !(requestDto is Authenticate))
{
res.RedirectToUrl("/auth/aadgraph?redirect=" + req.RawUrl.UrlEncode());
res.EndRequest();
}
});