Beim Aufbau eines Content-Management-System, das jQuery AJAX in seine GUI integriert habe, bin ich auf eine Hürde gestoßen. Es scheint, dass einige Kunden zu lange darüber nachdenken, was sie schreiben werden, und deshalb protokolliert die Server-Sitzung sie, natürlich das Netz, von dem sie keine Ahnung haben. Wenn sie versuchen, die Änderungen zu übermitteln, verwende ich einen Ajax-Aufruf an den Server, um die Daten zu speichern.Überprüfung auf HTTP-Autorisierung in mvc vor Ajax Formular Post
Was ich als nächstes erwarten würde ist, dass die MVC-Server-Anwendung einen "401 Unauthorized" Status zurückgeben würde. Ich könnte dann mein jquery ajax Objekt bekommen, um den Benutzer zu bitten, sich anzumelden und die Änderungen erneut zu senden, sobald der Benutzer autorisiert wurde.
Was jedoch tatsächlich von der MVC-Anwendung zurückgegeben wird, ist ein "302 Found" -Status und eine Weiterleitungs-URL zu meiner Anmeldeseite. Die Seite des Anmeldeformulars gibt einen Statuscode "200 OK" zurück, und das Objekt jquery ajax ruft das Erfolgsereignis auf, das dem Benutzer mitteilt, dass alles erfolgreich war, da dies die MVC-Anwendung angibt.
Gibt es eine Möglichkeit für mich, die MVC-Anwendung so zu spielen, wie ich denke, dass ich meine jquery ajax-Ereignisse ändern muss, um die Anmeldeseite zu erkennen?
Update:
I Reflektor verwendet habe einen Blick in das MVC-Code zu haben, und das Autorisieren Attribut, geben Sie den Code ein NotAuthorizedResult für das unten ist (0x191 = 401)
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
context.HttpContext.Response.StatusCode = 0x191;
}
Ich denke, dass die Forms Authorization HttpModule die 401 sieht und die Umleitung erzwingt.
In .Net 4.0 (vielleicht auch andere Versionen, weiß ich nicht), führt FormsAuthentication die Umleitung im EndRequest-Handler.Ich habe festgestellt, dass FormsAuth die Antwort nicht verarbeitet hat, wenn ich EndRequest verwendet habe, aber das PreSendRequestHeaders-Ereignis funktioniert viel besser (kommt nach EndRequest). Danke für diesen tollen Beitrag. – womp