如何停止IIS 7.0在发生403错误时重定向到自己的页面

3

我正在开发一款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时则失败了?
谢谢。
1个回答

2
您可以在应用程序的web.config文件中的httpErrors元素中进行定义。以下是文档链接:http://www.iis.net/configreference/system.webserver/httperrors 基本上您需要添加以下内容:
<httpErrors>
  <remove statusCode="403" subStatusCode="-1" />
  <error statusCode="403" path="[The path to custom page]" responseMode="ExecuteURL" />
</httpErrors>

谢谢回复,我添加了以下内容到web.config中的<httpErrors>: <remove statusCode="403" subStatusCode="-1" /> <error statusCode="403" path="~/Views/Errors/_Unauthorized.cshtml" responseMode="ExecuteURL" /> 但我目前遇到的问题是,如果发生403错误,将显示一个白色页面,并且在使用Firebug检查时会引发404错误,就好像它试图引用不存在的内容... - John John
1
我认为重定向到 CSHTML 文件不是一个好主意。我认为你应该创建一个错误控制器并将其重定向到那里。此外,请确保错误控制器本身没有受到保护,并且不使用任何安全资源。 - Elad Lachmi
为什么将重定向到自定义页面不是一个好主意?这是我的问题吗?我直接调用视图,而应该调用一个操作方法吗?谢谢。 - John John
问题不在于重定向到自定义页面,而在于您正在重定向到一个 CSHTML 文件。该文件可能包含服务器端代码,如果没有通过控制器调用,则不会运行该代码。您可以通过控制器调用此视图,或者只需创建静态的 HTML 文件并重定向到那里。 - Elad Lachmi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接