3 Stimmen

Ajax-Anmeldung mit ASP.Net MVC 2

Diese Frage bezieht sich auf ASP.NET Forms-Authentifizierung ohne Redirect aber ich kann es nicht zum Laufen bringen. MVC 2 änderte seine Skriptdateien und sie sind jetzt bekommen, wie hier aufgeführt:

http://www.asp.net/ajaxlibrary/CDNAjax4.ashx

Jetzt tappe ich noch im Dunkeln, aber durch Versuch und Irrtum habe ich mich auf folgende Punkte beschränkt

MicrosoftAjax.js
MicrosoftAjaxCore.js
MicrosoftAjaxComponentModel.js
MicrosoftAjaxSerialisierung.js
MicrosoftAjaxNetwork.js
MicrosoftAjaxWebServices.js
MicrosoftAjaxApplicationServices.debug.js

Das Problem ist, dass ich jetzt die Javascript-Ausnahme erhalte:

Microsoft JScript-Laufzeitfehler: Sys.InvalidOperationException: Der Pfad zum Webdienst wurde nicht festgelegt.

Von googeln um ich habe gefunden, dieser Pfad sollte "~/ScriptServices_AuthenticationService.asmx" sein, aber etwas wie tun:

Sys.Services._AuthenticationService.DefaultWebServicePath = "~/ScriptServices_AuthenticationService.asmx";

funktioniert nicht (ich gehe davon aus, dass es sich um ein privates Mitglied handelt). Also, die Frage, weiß jemand, wie man Ajax / async FormsAuth arbeiten? Gibt es eine endgültige Anleitung, welche js-Datei verschiedene MS ajax Dienste abhängen? Schließlich, wenn keiner der oben genannten, gibt es eine Möglichkeit, FormsAuth auf der Server-Seite zu tun, so dass es nicht umleiten (so kann ich nur die Controller-Aktion mit einem Ajax-Formular aufrufen)? ... Ich habe versucht, mit FormsAuthentication.SetAuthCookie(), aber das schien nicht für mich zu arbeiten.

Bearbeiten: Ich habe herausgefunden, dass FormsAuthentication.SetAuthCookie() tatsächlich funktioniert, aber es erfordert den Response-Stream geschlossen werden (wenn, natürlich, der Puffer gesendet wird und die Cookies gesetzt sind). Dies funktioniert nicht für mich, da das zu spät für meine Zwecke ist.

Bearbeiten: Die vollständige Beschreibung für das, was ich versuche, kann notwendig sein. Das Ajax-Formular, das ich habe, ist für die Erstellung eines neuen Kontos. Auf der Serverseite erstelle ich das Konto und melde mich an. Am Frontend warte ich auf das Ajax-Abschluss-Ereignis und leite dann mein Anmeldeassistenten-Formular auf die nächste Seite weiter, die durch andere Registrierungsschritte führt. Im Pseudocode sieht die Controller-Aktion wie folgt aus:

public JsonResult CreateAsync(LoginForm form)
{
    CreateAccount(form);

    FormsAuthentication.RedirectFromLoginPage(form.Email, false);

    return Json(
        new
        {
            Email = form.Email,
            Name = form.Name,
            Message = "Success"
        });
}

Die Anmeldemethode beendet den Antwortstrom, und dann gerät der clientseitige Ajax durcheinander. Ich habe versucht, FormsAuth.SetAuthCookie stattdessen aber hat die Probleme wie oben beschrieben.

0voto

Martin Murphy Punkte 1745

Ach, vergiss es. Eigentlich sollten Sie FormsAuthentication.Authenticate() anstelle von RedirectFromLoginPage verwenden.

Sie müssen dieses Verhalten selbst implementieren, wenn Sie die Methode als JSON-Anfrage aufrufen möchten.

-1voto

Andre Vianna Punkte 1714

Wie stellen Sie Ihr Formular dar? Verwenden Sie Html.Form oder Ajax.Form? Wenn Sie Ajax.Form (oder sogar Ajax.ActionForm) verwenden, können Sie die Anmeldeinformationen ohne Umleitung an den Controller senden und selbst nach der Rückkehr des Rückrufs in einem Client entscheiden, ob eine Umleitung erfolgen soll oder nicht. Ein Dienst ist nicht erforderlich, und der Authentifizierungsstatus wird serverseitig festgelegt und an den Client weitergegeben.

Ich habe einen vollständigen Code dafür, falls Sie diesen Ansatz ausprobieren möchten. Ich habe mich entschieden, es nicht richtig zu zeigen, weil es eine erhebliche Änderung an Ihrer Architektur sein könnte, die Sie vielleicht nicht machen wollen. Wenn Sie möchten, werde ich es hier posten.

-1voto

Martin Murphy Punkte 1745

Verwenden Sie einfach jQuery, um Ihre Controller-Methode wie folgt aufzurufen.

$("#login_button").click(function(){
$.ajax({url:"/Controller/CreateAsync", data:{Email: "someone@somewhere.com", Passwort: "asdfasfd"}, type: "POST", dataType: "json",
Erfolg:function(data){ //etwas tun
}) });

Eine Dokumentation finden Sie hier. http://api.jquery.com/jQuery.ajax/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X