RequiredRole,Razor2和HTML重定向

时间:2013-06-21 13:03:42

标签: servicestack

我正在使用带Razor2的ServiceStack。

我用RequiredRole("Admin")装饰了我的一项服务。我现在想要发生的是,如果我来自浏览器(Accept = text / html),如果我没有所需的角色,我想获得HTML重定向。相反,我得到一个403 Invalid Role,浏览器只显示一般错误。

有没有办法实现我的目标?我可以从RequiredRoleAttribute的来源看到它似乎不允许重定向。

 public override void Execute(IHttpRequest req, IHttpResponse res, object requestDto)
    {
        base.Execute(req, res, requestDto); //first check if session is authenticated
        if (res.IsClosed) return; //AuthenticateAttribute already closed the request (ie auth failed)

        var session = req.GetSession();
        if (HasAllRoles(req, session)) return;

        res.StatusCode = (int)HttpStatusCode.Forbidden;
        res.StatusDescription = "Invalid Role";
        res.EndServiceStackRequest();
    }

1 个答案:

答案 0 :(得分:1)

我想出了一个解决方案。我编写了自己的RoleRequiredCustomAttribute。它与ServiceStack RoleRequiredAttribute相同,但execute方法如下所示:

public override void Execute(IHttpRequest req, IHttpResponse res, object requestDto)
    {
        base.Execute(req, res, requestDto); //first check if session is authenticated
        if (res.IsClosed) return; //AuthenticateAttribute already closed the request (ie auth failed)

        var session = req.GetSession();
        if (HasAllRoles(req, session)) return;

        var htmlRedirect = HtmlRedirect ?? AuthService.HtmlRedirect;
        if (htmlRedirect != null && req.ResponseContentType.MatchesContentType(ContentType.Html))
        {
            var url = req.ResolveAbsoluteUrl(htmlRedirect);
            //url = url.AddQueryParam("redirect", req.AbsoluteUri);
            res.RedirectToUrl(url);
            return;
        }

        res.StatusCode = (int)HttpStatusCode.Forbidden;
        res.StatusDescription = "Invalid Role";
        res.EndServiceStackRequest();
    }

我应该提交拉取请求吗?