C# 自定义授权属性不存在';部署到IIS后无法工作

C# 自定义授权属性不存在';部署到IIS后无法工作,c#,.net,asp.net-mvc,iis,authorize-attribute,C#,.net,Asp.net Mvc,Iis,Authorize Attribute,我已经在asp.net mvc应用程序中重写了HandleUnauthorizedRequest方法,以确保它向未经授权的ajax调用发送401响应,而不是重定向到登录页面。当我在本地运行它时,它工作得非常好,但是一旦我部署到IIS,我的重写方法就不会被调用。调试点根本没有击中我的方法,并且直接被重定向到登录页面 这是我的代码: public class AjaxAuthorizeAttribute : AuthorizeAttribute { protected ove

我已经在asp.net mvc应用程序中重写了
HandleUnauthorizedRequest
方法,以确保它向未经授权的ajax调用发送401响应,而不是重定向到登录页面。当我在本地运行它时,它工作得非常好,但是一旦我部署到IIS,我的重写方法就不会被调用。调试点根本没有击中我的方法,并且直接被重定向到登录页面

这是我的代码:

public class AjaxAuthorizeAttribute : AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.HttpContext.Response.Clear();
                filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;

                filterContext.Result = new JsonResult
                {
                    Data = new
                    {
                        success = false,
                        resultMessage = "Errors"
                    },
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
                filterContext.HttpContext.Response.End();
                base.HandleUnauthorizedRequest(filterContext);
            }
            else
            {
                var url = HttpContext.Current.Request.Url.AbsoluteUri;
                url = HttpUtility.UrlEncode(url);
                filterContext.Result = new RedirectResult(ConfigurationManager.AppSettings["LoginUrl"] + "?ReturnUrl=" + url);
            }
        }
    }
我在控制器顶部声明了属性
[AjaxAuthorize]
。一旦部署到IIS,会有什么不同

更新: 下面是我的测试方法,非常简单,甚至不管是ajax请求还是登录会话过期后的简单页面刷新-

  • 我将站点部署到本地IIS上
  • 登录网站,进入主页-“/home”
  • 右键单击“注销”链接,“在新选项卡中打开”-这确保主页在当前选项卡上打开,同时 会话已注销
  • 刷新主页。现在,调试点应该点击我的重写
    HandleUnauthorizedRequest
    方法并通过 if/else条件,然后将我重定向到登录页面。但是它 不!它只是直接重定向到登录页面。我是 认为它甚至没有考虑我的自定义属性

  • 但是,当我从visual studio运行网站时,一切正常,控件在我的重写方法中进入调试点,并通过if/else条件。

    将网站部署到IIS时,默认情况下它将在IIS集成模式下运行。这通常是最好的选择。但这也意味着HTTP请求/响应模型在授权检查期间没有完全初始化。我怀疑这会导致当应用程序托管在IIS上时,
    IsAjaxRequest()
    总是返回
    false

    此外,系统的外观如下所示:

        protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs.
            filterContext.Result = new HttpUnauthorizedResult();
        }
    
    通过调用
    base.HandleUnauthorizedRequest(context)
    可以有效地覆盖使用默认
    HttpUnauthorizedResult
    实例设置的
    JsonResult
    实例

    这些被称为过滤器是有原因的。它们用于过滤进入某个逻辑段的请求,而不是实际执行该逻辑段。处理程序(
    ActionResult
    派生类)应该完成这项工作

    要实现这一点,您需要构建一个单独的处理程序,以便过滤器执行的逻辑等待
    HttpContext
    完全初始化之后

    public class AjaxAuthorizeAttribute : AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            filterContext.Result = new AjaxHandler();
        }
    }
    
    public class AjaxHandler : JsonResult
    {
        public override void ExecuteResult(ControllerContext context)
        {
            var httpContext = context.HttpContext;
            var request = httpContext.Request;
            var response = httpContext.Response;
            if (request.IsAjaxRequest())
            {
                response.StatusCode = (int)HttpStatusCode.Unauthorized;
    
                this.Data = new
                {
                    success = false,
                    resultMessage = "Errors"
                };
                this.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
                base.ExecuteResult(context);
            }
            else
            {
                var url = request.Url.AbsoluteUri;
                url = HttpUtility.UrlEncode(url);
                url = ConfigurationManager.AppSettings["LoginUrl"] + "?ReturnUrl=" + url;
                var redirectResult = new RedirectResult(url);
                redirectResult.ExecuteResult(context);
            }
        }
    }
    
    注意:以上代码未经测试。但这会让你朝着正确的方向前进


    将网站部署到IIS时,默认情况下它将在IIS集成模式下运行。这通常是最好的选择。但这也意味着HTTP请求/响应模型在授权检查期间没有完全初始化。我怀疑这会导致当应用程序托管在IIS上时,
    IsAjaxRequest()
    总是返回
    false

    此外,系统的外观如下所示:

        protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs.
            filterContext.Result = new HttpUnauthorizedResult();
        }
    
    通过调用
    base.HandleUnauthorizedRequest(context)
    可以有效地覆盖使用默认
    HttpUnauthorizedResult
    实例设置的
    JsonResult
    实例

    这些被称为过滤器是有原因的。它们用于过滤进入某个逻辑段的请求,而不是实际执行该逻辑段。处理程序(
    ActionResult
    派生类)应该完成这项工作

    要实现这一点,您需要构建一个单独的处理程序,以便过滤器执行的逻辑等待
    HttpContext
    完全初始化之后

    public class AjaxAuthorizeAttribute : AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            filterContext.Result = new AjaxHandler();
        }
    }
    
    public class AjaxHandler : JsonResult
    {
        public override void ExecuteResult(ControllerContext context)
        {
            var httpContext = context.HttpContext;
            var request = httpContext.Request;
            var response = httpContext.Response;
            if (request.IsAjaxRequest())
            {
                response.StatusCode = (int)HttpStatusCode.Unauthorized;
    
                this.Data = new
                {
                    success = false,
                    resultMessage = "Errors"
                };
                this.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
                base.ExecuteResult(context);
            }
            else
            {
                var url = request.Url.AbsoluteUri;
                url = HttpUtility.UrlEncode(url);
                url = ConfigurationManager.AppSettings["LoginUrl"] + "?ReturnUrl=" + url;
                var redirectResult = new RedirectResult(url);
                redirectResult.ExecuteResult(context);
            }
        }
    }
    
    注意:以上代码未经测试。但这会让你朝着正确的方向前进


    部署到IIS后会有什么不同?
    -
    ConfigurationManager.AppSettings[“LoginUrl”]
    -是否检查了配置文件?是的,我检查了,它指向“帐户/登录”。但问题是在部署到IIS后,控件甚至没有输入我的自定义属性的
    HandleUnauthorizedRequest
    方法,即使我完全删除了“LoginUrl”的配置设置,它仍然重定向到“Account/Login”,这个问题只有在我部署之后才会发生。我尝试在调试和发布配置中进行部署,但同样的问题
    部署到IIS后会有什么不同?
    -
    ConfigurationManager.AppSettings[“LoginUrl”]
    -是否检查了配置文件?是的,我检查了,它指向“帐户/登录”。但问题是在部署到IIS后,控件甚至没有输入我的自定义属性的
    HandleUnauthorizedRequest
    方法,即使我完全删除了“LoginUrl”的配置设置,它仍然重定向到“Account/Login”,这个问题只有在我部署之后才会发生。我尝试在调试和发布配置中部署,但问题相同