2017-04-05 3 views
1

Ich habe eine Website, die einige Formulare, die ASP.NET MVC Ajax verwenden. Ein Beispiel für BeginForm Methode:ASP.NET MVC Ajax Formular eingereicht Cross-Domain nicht senden Cookies

@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"> 
} 

Beachten Sie, dass aufgrund des Request.Url.Scheme param in der der Url.Action Methode wird die URL als die Domäne zu einer anderen Domäne festgelegt wird, dass der Browser diese aus erhält. Dies geschieht, weil die Hauptseite statisch mithilfe eines CDN gehostet wird, während das Formular mithilfe von AJAX aus einer anderen Domäne geladen wird. Dies funktioniert, außer dass die Cookies nicht in der AJAX-Anfrage gesendet werden. Ich habe versucht, die Cookies von xhr.withCredentials = true Einstellung unter Verwendung des OnBegin Ereignis und dieses JavaScript gesendet haben:

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

Während ich sehen kann, dass SetWithCredentialsTrue() Methode, es scheint nicht zu arbeiten aufgerufen wird, dass die HTTP-Anforderung erzeugt wird, wenn die Formular ist gesendet hat nicht den Cookie-Header.

Alle der serverseitigen Handler Einstellen der Access-Control-Allow-Credentials Antwortheader true und die Access-Control-Allow-Origin an die Haupt (statisch) Site-Domäne.

UPDATE: Mit etwas mehr Konsolenprotokollierung, habe ich festgestellt, dass die xhr Parameter auf meine OnBegin Event-Handler übergeben (SetWithCredentialsTrue) kein XMLHttpRequest Objekt und somit Einstellung withCredentials auf sie nicht beeinflussen muss. Die Frage ist also, wie kann ich auf das XMLHttpRequest-Objekt zugreifen?

Antwort

1

ich das endlich herausgefunden. Das XMLHttpRequest-Objekt wird nicht über die ASP.NET MVC-Bibliothek verfügbar gemacht. Ich konnte jquery.unobtrusive-ajax.js, die JS-Bibliothek mit dem ASP.NET MVC Helfer verwendet ändern, so dass es withCredentials auf true setzt:

$(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 
     } 
    }); 
}); 

Hinweis: xhrFields der Teil ist, dass ich hinzugefügt.

0

nach meinem Verständnis was Sie versuchen zu tun ist, möchten Sie Daten von einer Domäne zu einer anderen Domäne mit AJAX Post rechts senden?

Wenn es wahr ist, dann möchte ich Ihnen sagen, dass der Browser dies aus Sicherheitsgründen nicht erlaubt.

Wenn Sie das immer noch tun möchten, haben Sie zwei Möglichkeiten mit CORS und 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

+0

Die Frage bezieht sich auf das Senden eines ASP.NET MVC AJAX-Formulars von einer Domäne zu einer anderen. Ich bin in der Lage, ähnliche Anfragen mit JQuery zu stellen, indem ich 'xhr.withCredentials = true' setze, aber ich möchte das gleiche vom ASP.NET MVC Ajax Formular machen. Ansonsten funktioniert CORS - das Formular reicht ein, es sendet den Cookie-Header einfach nicht. – Alex

Verwandte Themen