我正在开发一款asp.net mvc网络应用程序,该应用程序内部定义了一个自定义授权属性。如果用户没有权限,则该属性将返回403错误;同时,它还提供了两种响应类型,具体取决于请求是否为Ajax:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class CheckUserPermissionsAttribute : AuthorizeAttribute
{
public string Model { get; set; }
public string Action { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
//code goes here .......
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new HttpStatusCodeResult(403, "Sorry, you do not have the required permission to perform this action.");
}
else
{
var viewResult = new ViewResult();
viewResult.ViewName = "~/Views/Errors/_Unauthorized.cshtml";
filterContext.HttpContext.Response.StatusCode = 403;
filterContext.Result = viewResult;
}
}
}
问题在于我的当前方法在开发环境下运行正常(未部署到IIS),但当我将应用程序部署到IIS 7上的暂存服务器时,所有具有403错误代码的http请求(非ajax)将重定向到以下页面,而不是重定向到我创建的自定义页面
~/Views/Errors/_Unauthorized.cshtml
。如果请求是Ajax,则会显示在我的Ajax设置中定义的jAlert框。因此,我有以下两个问题:
1. 如何强制我的IIS在引发403错误时不重定向到其自己的页面,并重定向到
~/Views/Errors/_Unauthorized.cshtml
视图?
2. 为什么我的方法在请求是Ajax请求时可以正常工作,而请求是非Ajax时则失败了?谢谢。
CSHTML
文件不是一个好主意。我认为你应该创建一个错误控制器并将其重定向到那里。此外,请确保错误控制器本身没有受到保护,并且不使用任何安全资源。 - Elad LachmiCSHTML
文件。该文件可能包含服务器端代码,如果没有通过控制器调用,则不会运行该代码。您可以通过控制器调用此视图,或者只需创建静态的HTML
文件并重定向到那里。 - Elad Lachmi