asp.net ajax 401,关于asp.net mvc:与IIS的奇怪的AJAX重定向401问题

我应该删除这个问题吗?

我弄清楚问题是什么,而不是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"

dbeecf9a9cfa5d00aacbfc9364c7f507.png

redirectType="Found"

4b23ed51842a110f933db0e2b5b8ad1f.png

redirectType="Temporary"

0b28b4e6538493c6f52102f7cfebe539.png

从截图中可以看出,唯一的区别是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问题的理解就完全不同了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值