【发布时间】:2017-09-27 07:24:03
【问题描述】:
我在我的 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 条件。
【问题讨论】:
-
What could be different once it's deployed to IIS?-ConfigurationManager.AppSettings["LoginUrl"]- 你检查你的配置文件了吗? -
是的,我检查了,它指向“帐户/登录”。但问题是部署到IIS后,控件甚至没有进入我自定义属性的
HandleUnauthorizedRequest方法,即使我完全删除了“LoginUrl”的配置设置,它仍然重定向到“Account/Login”,出现这个问题只有在我部署之后。我尝试在调试和发布配置中进行部署,但同样的问题
标签: c# .net asp.net-mvc iis authorize-attribute