asp.net mvc 2 - 当 RedirectToAction 使用 JSON 数据时失去授权

Posted

技术标签:

【中文标题】asp.net mvc 2 - 当 RedirectToAction 使用 JSON 数据时失去授权【英文标题】:asp.net mvc 2 -- losing authorization when RedirectToAction with JSON data 【发布时间】:2011-05-05 21:12:22 【问题描述】:

我正在重构一些最初使用 POST 表单数据的 MVC 代码。表单的字段使用 jquery 的 serialize() 方法进行序列化,并发送到 MVC 控制器保存操作,该控制器检查并根据需要 重定向(如果表单值有错误,重定向到编辑操作,如果没问题,那么保存并重定向到显示操作)。所有操作都通过 AJAX 调用并返回部分视图。一切都很好。注意:该站点使用基于 AD 的授权,因此在首次加载站点时会提示用户输入其 Windows 凭据,但不会再次提示。

但是,我现在希望通过 JSON 对象而不是表单字段与服务器交互。当然,我在客户端序列化 JSON 对象,并借助导入的 MVC2 Futures/MVC3 类 JsonValueProviderFactory,能够正确地将发送的 JSON 对象模型绑定到控制器参数中的 C# 类。

我保持相同的逻辑,但是当我尝试在 Controller 接受 JSON 对象时返回 RedirectToAction ActionResult 时,事情就开始崩溃了。我失去了身份验证,再次提示用户输入他们的凭据,我发现自己陷入了最初请求的操作(保存)的无限循环中。每次提示用户输入凭据时,只需再次运行“保存操作”即可。用户的最终结果是提示输入登录凭据的无休止警报。在 RedirectToAction 调用中指定的任何操作都不会被命中。

原始请求使用 JSON contentType 的事实会干扰 RedirectToAction 的行为吗?这是我唯一能想到的,因为当我不使用 JSON 发布时它可以正常工作当我返回 PartialViews 而不是使用 RedirectToAction 时它工作正常。 Controller Action 的无限重复和授权凭据的不断丢失似乎表明 RedirectToAction 在这种情况下不是要走的路。

我可以根据要求发布代码。我也成功地处理了一些事情,比如将 ModelState 复制到 TempData 和其他 RedirectToAction 技巧。同样,它在使用非 JSON 解决方案时确实有效。非常感谢任何见解!


使用后续信息进行编辑:

事实证明,即使我完全禁用网站的 NTLM 身份验证/授权,我也会收到“未经授权”错误。 IIS 服务器不查找任何授权,网站不查找任何授权,但尝试使用 JSON contentType 请求重定向时仍然出现错误,并抱怨“未经授权”。这很奇怪。

【问题讨论】:

【参考方案1】:

为了更新大家,我还没有找到解决方案,我也不确定是什么情况。但是,我敢打赌,这与 RedirectToAction 发出 http GET 请求以及我重定向到的操作只接受 POST 的事实有关。即使我取消了限制,它仍然在发送 JSON 数据,并且仍然需要通过 POST 来完成。

简而言之,带有 JSON 数据的 RedirectToAction 似乎基本上是可撤销的。您需要 POST JSON 数据,但 RedirectToAction 会发出 GET 请求。这是我的理论,至少。 =)

【讨论】:

以上是关于asp.net mvc 2 - 当 RedirectToAction 使用 JSON 数据时失去授权的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net MVC 2 RC2:当所有可选参数为空时,自定义路由返回 404

Asp.net MVC 之请求生命周期

Asp.net MVC 之异常处理

VueJS 2 + ASP.NET MVC 5

ASP.NET Core 2,使用没有 MVC 的 Razor 页面单击按钮

当表单处于空闲状态时,ASP.NET MVC 操作参数未绑定