我在 ASP.NET MVC 控制器上使用自定义授权过滤器,如果用户在特定操作上授权失败,该过滤器会将用户重定向到登录屏幕以外的 URL。
这对于返回视图的操作来说是可以的,但是我的许多操作返回其他结果类型,例如 PartialResult 或 JsonResult。
我当前的过滤器如下所示:
这表明如果用户不属于 ServerAccess 角色,那么他们应该被重定向到 /Home/Unauthorized/
我很好奇其他人是如何处理这个问题的?当您考虑仅由客户端脚本 AJAX 调用调用的操作数量时,这似乎尤其成问题。 /Home/Unauthorized/ 操作如何知道调用者是否打算接收视图、partialview、json、内容等?
使用Request.IsAjaxRequest(),例如:
public sealed class AjaxAuthorizeAttribute : AuthorizeAttribute
{
public AjaxAuthorizeAttribute() : base()
{
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
// Extends the original Web.MVC.AuthorizeAttribute for Ajax calls.
// Basically if the request is not authorized and the request is an AJAX Request.
// then we simply set the stats Code to 403 and set an empty Result, in order to
// determine in Javascript if the AJAX call came back completed and valid.
base.OnAuthorization(filterContext);
if (filterContext.Result == null)
{
return;
}
else if (filterContext.Result.GetType() == typeof(HttpUnauthorizedResult)
&& filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new ContentResult();
filterContext.HttpContext.Response.StatusCode = 403;
}
}
}
请注意 403,而不是 401,因为 ASP.NET 会拦截 401 并将其转换为 HTML 错误页面。 AJAX 调用期望收到什么并不重要;它仍然可以看到状态代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)