要求(几乎)使用ServiceStack的每个请求进行身份验证

时间:2018-05-09 17:09:31

标签: authentication servicestack

我正在使用ServiceStack构建ERP并将身份验证连接并正常工作。但是,我想要在基本上每个路由,DTO或静态页面上要求身份验证 - 除了登录页面和支持资源(CSS,图像)。

有一种简单,集中的方式吗?我可以将[Authenticate]应用于每个DTO /路线,但很容易错过一个。

如何对所有请求进行身份验证,请保存一些?我怀疑是某种形式的global request filter,但我不确定如何开始。

2 个答案:

答案 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();
    }
});