我正在使用带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();
}
答案 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();
}
我应该提交拉取请求吗?