C# 自定义授权属性不存在';部署到IIS后无法工作
我已经在asp.net mvc应用程序中重写了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
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请求还是登录会话过期后的简单页面刷新-
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”,这个问题只有在我部署之后才会发生。我尝试在调试和发布配置中部署,但问题相同