我应该删除这个问题吗?
我弄清楚问题是什么,而不是IIS ......请参阅下面的答案,了解结果。
原始问题
我正在开发一个ASP.Net MVC应用程序,并遇到一个奇怪的问题,即URL Rewrite重定向和AJAX请求。
我已将以下重写规则添加到根网站中的Web.config中。
如果我在配置中使用Permanent或Temporary redirectType但是使用HTTP Error 401.0 - Unauthorized IIS错误页面失败,则一切似乎都正常。
当我通过浏览器向正常的GET请求发出触发此规则的操作时,例如https://some-site/SubApp/Account/Settings然后我得到302 Found并且位置标头设置为预期的URL https://some-site/Account/Settings并呈现相应的页面。
但是,当我通过JQuery的AJAX(即$.get('https://some-site/SubApp/Account/Settings'))发出GET请求时,返回的响应状态代码为401 Unauthorized,但它仍然具有相应的位置标头。
响应的内容是标准的IIS HTTP Error 401.0 - Unauthorized错误页面。
奇怪的是,如果我在配置中使用Permanent或Temporary重定向类型但是只有Found失败,一切似乎都能正常工作。
/SubApp是位于根网站/下方的单独应用程序。
这是怎么回事?
截图
redirectType="Permanent"
redirectType="Found"
redirectType="Temporary"
从截图中可以看出,唯一的区别是Web.config中指定的redirectType。
正如您所看到的那样,重定向正在按预期发生,但Found重定向类型除外,我希望将302 - Found响应重定向到与其他重定向相同的URL。
你能添加代码吗?
你能为两种情况添加网络流量的截图(工作/不工作)吗?
我能做到,但它非常$.get("/BMS/Account/Settings")。 我将用一些截图更新问题...
我怀疑你得到了一个不一样的原产地问题。 对于虚拟URL使用url helper和tilda斜杠被认为是更好的做法,让框架可以解决问题。 这样你就不太可能得到错误的401起源。
@DaveAlperovich - 如果是这样的话,为什么它适用于Permanent和Temporary重定向?
啊,你知道,当你暂时没有想到什么东西时,你会突然受到启发......好吧它发生在昨晚,我发现这个小金块用来"修复"MVC对重定向AJAX请求的坚持 身份验证失败
protected void Application_EndRequest()
{
var context = new HttpContextWrapper(Context);
// MVC retuns a 302 for unauthorized ajax requests so alter to request status to be a 401
if (context.Response.StatusCode == 302 && context.Request.IsAjaxRequest() && !context.Request.IsAuthenticated)
{
context.Response.Clear();
context.Response.StatusCode = 401;
}
}
并且,毫无疑问,context.Request.IsAuthenticated总是假的,因为它似乎被重定向重置。
在Branislav Abadjimarinov关于这个主题的博客文章的帮助下,对此进行了更新。
protected void Application_EndRequest()
{
var context = new HttpContextWrapper(Context);
// MVC returns a 302 for unauthorized ajax requests so alter to request status to be a 401
if (context.Response.StatusCode == 302 && context.Request.IsAjaxRequest())
{
//Unfortunately the redirect also clears the results of any authentication
//Try to manually authenticate the user...
var authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
if (authTicket != null && !authTicket.Expired)
{
var roles = authTicket.UserData.Split(',');
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(authTicket), roles);
}
}
if (!context.Request.IsAuthenticated)
{
context.Response.Clear();
context.Response.StatusCode = 401;
}
}
}
这一切都按预期工作。
我唯一的问题是我应该删除这个问题吗? del>
不要删除它,它可能对将来的访问者有所帮助
看看这个无法处理ajax中的302重定向,为什么? [重复],看起来Web浏览器看到Found-302并对其执行操作。
我明天会仔细检查,但是会话已经过完全身份验证,我看到301都有一个位置标题,然后是浏览器对新位置的后续请求,当设置为Permanent时,我会看到200状态响应 当redirectType设置为Temporary时,第一个响应的307状态代码除外。 当它被设置为Found时,我得到一个401但奇怪的是,位置标头被设置为我期望重定向指向的资源。 我不是试图手动处理重定向,而且位置标头指向正确的资源。
Brian,我可能会遗漏一些东西,但你发现的链接似乎是关于不将未经授权的请求重定向到授权页面bc页面重定向不能在ajax中发生。 如果是这样,我对OP问题的理解就完全不同了。