2

我将 ServiceStack 与 Razor2 一起使用。

我用 装饰了我的一项服务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();
    }
4

1 回答 1

1

我想出了一个解决方案。我已经编写了自己的 RoleRequiredCustomAttribute。它与ServiceStackRoleRequiredAttribute 相同,只是执行方法如下所示:

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

我应该提交拉取请求吗?

于 2013-06-21T15:30:38.557 回答