ASP.NET MVC Ajax表单跨域提交,未发送Cookie



我有一个网站,它有一些使用 ASP.NET MVC Ajax的表单。BeginForm方法的示例:

@using (Ajax.BeginForm("HandleSignin", "Profile", null, new AjaxOptions() { 
HttpMethod = "POST", 
Url = Url.Action("HandleSignin", "Profile", null, Request.Url.Scheme), 
OnBegin = "SetWithCredentialsTrue(xhr)", 
InsertionMode = InsertionMode.Replace, 
UpdateTargetId = "signin-form-container" }, 
new { id = "sign-in-form", @class = "text-left-desktop group" }))
{
@Html.AntiForgeryToken()
@Html.TextBoxFor(x => Model.Email, new { placeholder = "Email" })
@Html.PasswordFor(x => Model.Password, new { placeholder = "Password" })
<input type="submit" value="SignIn" class="button small-button">
}

请注意,由于 Url.Action 方法中的Request.Url.Scheme参数,URL 被设置为与浏览器从中获取此域的域不同的域。这样做是因为主站点使用 CDN 静态托管,而表单使用 AJAX 从另一个域加载。这有效,除了 cookie 不会在 AJAX 请求中发送。 我尝试通过使用OnBegin事件和此 JavaScript 设置xhr.withCredentials = true来发送 cookie:

<script type="text/javascript">
function SetWithCredentialsTrue(xhr) {
console.log("SetWithCredentialsTrue(xhr)", xhr);
xhr.withCredentials = true;
}
</script>

虽然我可以看到SetWithCredentialsTrue()方法被调用,但它似乎不起作用,因为提交表单时生成的 HTTP 请求没有 Cookie 标头。

所有服务器端处理程序都将Access-Control-Allow-Credentials响应标头设置为true,将Access-Control-Allow-Origin设置为主(静态)站点域。

更新:通过更多的控制台日志记录,我已经验证了传递给我的OnBegin事件处理程序(SetWithCredentialsTrue)的xhr参数不是XMLHttpRequest对象,因此在其上设置凭据不会产生影响。所以问题是我如何访问XMLHttpRequest对象?

我终于想通了。XMLHttpRequest 对象不会通过 ASP.NET MVC 库公开。 我能够更改jquery.unobtrusive-ajax.js,这是 ASP.NET MVC助手使用的JS库,以便它将withCredentials设置为true:

$(document).on("submit", "form[data-ajax=true]", function (evt) {
var clickInfo = $(this).data(data_click) || [],
clickTarget = $(this).data(data_target),
isCancel = clickTarget && clickTarget.hasClass("cancel");
evt.preventDefault();
if (!isCancel && !validate(this)) {
return;
}
asyncRequest(this, {
url: this.action,
type: this.method || "GET",
data: clickInfo.concat($(this).serializeArray()),
xhrFields: {
withCredentials: true
}
});
});

注意:xhrFields是我添加的部分。

根据我的理解,您要做的是,您想使用 AJAX 帖子将数据从一个域发送到另一个域,对吗?

如果这是真的,那么我想告诉你,由于安全问题,浏览器不允许你这样做。

如果您仍然想这样做,那么使用 CORS 和 JSONP 有两个选项。

http://csharp-video-tutorials.blogspot.in/2016/09/calling-aspnet-web-api-service-in-cross.html

http://csharp-video-tutorials.blogspot.in/2016/09/cross-origin-resource-sharing-aspnet.html

相关内容

  • 没有找到相关文章

最新更新