我有一个网站,它有一些使用 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