【问题标题】:Forms authentication cookie not sent in ajax post from http to https (the same domain)表单身份验证 cookie 未在 ajax 帖子中从 http 发送到 https(同一域)
【发布时间】:2011-12-09 16:27:32
【问题描述】:

我将 AJAX 表单从 http 方案中的页面发送到 https url(域和应用程序是相同的)。我使用 MVC 3 Ajax 助手:

@using (Ajax.BeginForm(MVC.Payment.Confirm(), new AjaxOptions
{
    HttpMethod = "Post",
    UpdateTargetId = "myId",
    InsertionMode = InsertionMode.Replace,
    OnBegin = "$('#popupAjaxLoader').show();",
    OnSuccess = "$('#popupAjaxLoader').hide();",
    Url = "https://same.domain/payment/confirm"
}, new { @action = "https://same.domain.com/payment/confirm" }))
{   
...
}

在应用程序中我使用表单身份验证:

   <forms loginUrl="~/Account/LogOn" timeout="2880" name="MYCOOKIENAME" />

在firebug中我可以看到提交表单时没有将身份验证cookie发送到服务器,因此处理程序失败(请求需要授权)。 如何强制 Ajax.BegiForm 附加身份验证 cookie?

更新:

事实证明,如果不需要从 ajax 请求中接收任何信息,那么courtlorben 给出的解决方案是有效的。将 Ajax POST 从 HTTP 发送到 HTTPS 工作正常(未附加 cookie,因此您必须将所有必要的数据作为隐藏的表单字段发布),但由于同源策略,javascript 无法访问服务器响应。 最终我不得不放弃 Ajax 并将表单放在 iframe 中引用 HTTPS url,这似乎是解决这个问题的最终解决方案。

【问题讨论】:

    标签: jquery ajax asp.net-mvc-3 cookies https


    【解决方案1】:

    您的问题是这违反了Same Origin Policy。请参阅此问题的回复:Same origin policy with same domain, but https

    更新

    如果无法让整个门户使用 HTTPS,那么另一种方法是为您的 AJAX 表单提交使用不同的身份验证方案。

    我建议为 AJAX 表单创建一个 GUID 令牌,将 GUID 连同 (1) 它的创建时间和 (2) GUID 分配到的用户的 ID 一起存储在您的存储库中。然后在 AJAX 表单上的隐藏字段中传递 GUID。

    从通过 AJAX 表单调用的操作中删除 [Authorize] 属性,并在您的操作中检查是否传递了 GUID、GUID 有效且尚未过期(将过期时间设置为 20 分钟,或在这些情况下有效的任何东西)。使用 GUID 令牌来识别您的用户,并根据需要继续操作。

    此外,您应该有一些方法来清除过期的 GUID 令牌。

    这应该提供足够的安全性,因为 GUID 令牌是发给授权用户的,并且可以识别提交 AJAX 表单的用户。它还允许您仅将 HTTPS 用于 AJAX 表单提交,因为您不再依赖正在传递的身份验证 cookie。

    【讨论】:

    • 好的,但是有什么解决方法吗?我需要这个 ajax POST 请求是安全的,因为它包含输入到表单中的敏感数据,但是执行 ajax 脚本的页面是一个常规页面 - 将其切换到 https 将需要整个门户在 HTTPS 中工作,即不是我想要的。
    • 在您编辑回复时,我开始编写几乎相同的解决方案 - 实现自己的授权而不依赖表单身份验证 cookie。这似乎是最整洁的解决方案。谢谢!
    猜你喜欢
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2019-02-22
    • 2023-03-15
    • 2020-07-06
    相关资源
    最近更新 更多