ValidateAntiForgeryToken mit SPA-Architektur
Ich versuche zu Register und Login Heißen Handtuch SPA applicantion. Erstellt habe ich SimpleMembershipFilters und ValidateHttpAntiForgeryTokenAttribute auf der Grundlage der asp.net single page application template.
Wie kommst du auf die
@Html.AntiForgeryToken()
code in die Durandal SPA-Muster.
Derzeit habe ich eine register.html
<section>
<h2 data-bind="text: title"></h2>
<label>Firstname:</label><input data-bind="value: firstName" type="text" />
<label>Lastname:</label><input data-bind="value: lastName" type="text" />
<label>Email:</label><input data-bind="value: emailAddress" type="text" />
<label>Company:</label><input data-bind="value: company" type="text" />
<br />
<label>Password:</label><input data-bind="value: password1" type="password" />
<label>Re-Enter Password:</label><input data-bind="value: password2" type="password" />
<input type="button" value="Register" data-bind="click: registerUser" class="btn" />
</section>
register.js:
define(['services/logger'], function (logger) {
var vm = {
activate: activate,
title: 'Register',
firstName: ko.observable(),
lastName: ko.observable(),
emailAddress: ko.observable(),
company: ko.observable(),
password1: ko.observable(),
password2: ko.observable(),
registerUser: function () {
var d = {
'FirstName': vm.firstName,
'LastName': vm.lastName,
'EmailAddress': vm.emailAddress,
'Company': vm.company,
'Password': vm.password1,
'ConfirmPassword': vm.password2
};
$.ajax({
url: 'Account/JsonRegister',
type: "POST",
data: d ,
success: function (result) {
},
error: function (result) {
}
});
},
};
return vm;
//#region Internal Methods
function activate() {
logger.log('Login Screen Activated', null, 'login', true);
return true;
}
//#endregion
});
In der $ajax-Aufruf wie gebe ich die AntiForgeryToken? Auch wie erstelle ich die token auch?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde Lesen dieser Artikel, wie antiforgery Token mit javascript. Der Artikel ist geschrieben für WebApi, aber es kann leicht angewendet werden, um eine MVC-controller, wenn Sie möchten.
Die kurze Antwort ist etwas wie dieses:
In Ihrem cshtml anzeigen:
Dann in Ihrem asp.net controller müssen Sie zur Validierung der token-wie so:
Den Grund Sie will es pass in den Kopf ist, weil wenn Sie übergeben Sie es als parameter-Daten parameter, in deinem ajax-Aufruf, innerhalb der querystring oder den Körper der Anfrage. Dann wird es schwieriger für Sie, um die antiforgery token für alle Ihre verschiedenen Szenarien. Da haben Sie, um Deserialisieren den Körper und dann finden Sie den token ein. In der Header ziemlich konsistent und einfach abrufen.
****edit-ray**
Hier ist ein Beispiel für eine Aktion filter, die Sie verwenden können, um die Attribut-web-api-Methoden, um zu überprüfen, ob eine antiforgerytoken zur Verfügung.
ValidateRequestHeader
?IAuthorizationFilter
aber diepublic void OnAuthorization( AuthorizationContext filterContext )
Methode fehlt..cshtml
und meinen WELLNESS-Seiten/Ansichten sind einfache HTML-Seiten, so dass es gewann ' T Arbeit für mich.Schnappen Wert von token in JS var
Dann einfach hinzufügen, um Ihre ajax-POST-Header in der beforeSend Funktion der .ajax nennen
Ich kämpfte ein wenig mit diesem, da keine der bestehenden Antworten schien einwandfrei zu arbeiten, für den Fall meiner Durandal SPA app basiert auf dem Hot Towel Template.
Hatte ich die Verwendung einer Kombination von Evan Larson und curtisk Antworten zu etwas, das funktionierte so denke ich sein soll.
Meinem index.cshtml-Seite (Durandal unterstützt cshtml neben html) habe ich den folgenden knapp oberhalb der
</body>
tagIch Hinzugefügt eine benutzerdefinierte filter-Klasse wie dies durch Evan Larson, aber ich hatte zu ändern, um Unterstützung zu suchen, bis Sie den cookie-Wert separat und nutzen __RequestVerificationToken wie der name anstatt RequestVerificationToken wie das ist, was geliefert wird, durch AntiForgery.GetHtml();
Später in meinem App_Start/FilterConfig.cs habe ich noch folgende
In der Application_Start-unter meiner Global.asax, fügte ich
Schließlich für meine ajax-calls habe ich noch eine Ableitung von curtisk Eingangs-lookup, um einen header hinzufügen, um meine ajax-request, in dem Fall eine login-Anfrage.
Dies bewirkt, dass alle meine post-Anforderungen zu verlangen, eine überprüfung token, basierend auf dem cookie und mit dem versteckten Formular Verifizierung-Token erstellt von AntiForgery.GetHtml();
Aus meinem Verständnis dies wird verhindern, dass das Potenzial für cross-site-scripting-Attacken als angreifende Website benötigen würde, um in der Lage sein, sowohl die Cookies und die versteckte form Wert zu sein in der Lage, selbst zu überprüfen, das wäre viel schwieriger zu erwerben.
Wenn mit MVC 5 Lesen Sie diese Lösung!
Ich habe versucht, die oben genannten Lösungen, aber Sie funktionierte nicht für mich, die Aktion Filter wurde nie erreicht, und ich konnte nicht herausfinden, warum. Das MVC-version wird nicht erwähnt, aber ich werde davon ausgehen, es war die version 4. Ich bin mit version 5 in meinem Projekt und endete mit der folgenden Aktion filter:
-- Notieren Sie sich die
using System.Web.Mvc
undusing System.Web.Mvc.Filters
, nicht diehttp
Bibliotheken (ich glaube, das ist eines der Dinge, die geändert mit MVC-v5. --Dann einfach den filter anwenden
[ValidateJSONAntiForgeryHeader]
auf Ihre Aktion (oder controller) und es sollte aufgerufen werden, richtig.In meinem layout-Seite rechts oben
</body>
ich habe@AntiForgery.GetHtml();
Schließlich in meinem Rasiermesser Seite, ich habe das ajax-Aufruf wie folgt: