asp.net-mvc
Html.AntiForgeryToken
Suche…
Einführung
Das fälschungssichere Token kann verwendet werden, um Ihre Anwendung vor Standortfälschungen zu schützen. Rufen Sie zur Verwendung dieser Funktion die AntiForgeryToken-Methode aus einem Formular auf und fügen Sie der zu schützenden Aktionsmethode das ValidateAntiForgeryTokenAttribute-Attribut hinzu.
Erzeugt ein ausgeblendetes Formularfeld (fälschungssicheres Token), das beim Senden des Formulars überprüft wird.
Syntax
- @ Html.AntiForgeryToken ()
Bemerkungen
__RequestVerificationToken
einer Ajax-Anforderung mit dem CSRF-Token ( __RequestVerificationToken
) sicher, dass der Inhaltstyp nicht auf application/json
. Wenn Sie jQuery verwenden, wird der Inhaltstyp automatisch auf application/x-www-form-urlencoded
wird dann von ASP.NET MVC erkannt.
Vorsicht
Seien Sie vorsichtig, wenn Sie diesen Wert einstellen. Bei unsachgemäßer Verwendung können Sicherheitslücken in der Anwendung geöffnet werden.
Grundlegende Verwendung
Die @Html.AntiForgeryToken()
Helfer-Methode schützt vor Angriffen, die sich auf Cross-Site Request Forgery (oder CSRF) @Html.AntiForgeryToken()
.
Sie können es verwenden, indem Sie einfach den Html.AntiForgeryToken()
in einem Ihrer vorhandenen Formulare verwenden und die entsprechende Controller-Aktion mit dem Attribut [ValidateAntiForgeryToken]
dekorieren.
Rasierer (YourView.cshtml)
@using (Html.BeginForm("Manage", "Account")) {
@Html.AntiForgeryToken()
<!-- ... -->
}
ODER
<form>
@Html.AntiForgeryToken()
<!-- ... -->
</form>
Controller (YourController.cs)
Die Zielaktionsmethode:
[ValidateAntiForgeryToken]
[HttpPost]
public ActionResult ActionMethod(ModelObject model)
{
// ...
}
Identitätsheuristische Prüfung deaktivieren
Oft sehen Sie eine Ausnahme
Anti forgery token is meant for user "" but the current user is "username"
Dies liegt daran, dass das Anti-Forgery-Token auch mit dem aktuell angemeldeten Benutzer verknüpft ist. Dieser Fehler wird angezeigt, wenn sich ein Benutzer anmeldet, sein Token jedoch weiterhin mit einem anonymen Benutzer für die Site verknüpft ist.
Es gibt mehrere Möglichkeiten, dieses Verhalten zu beheben. Wenn Sie jedoch nicht möchten, dass CSRF-Token mit dem angemeldeten Status eines Benutzers verknüpft sind, können Sie diese Funktion deaktivieren.
Global.asax
Sie diese Zeile in Ihre Global.asax
Datei oder eine ähnliche Anwendungsstartlogik ein.
AntiForgeryConfig.SuppressIdentityHeuristicChecks = true;
Alle Beiträge überprüfen
Aufgrund der Sicherheitsanfälligkeit, die durch CSRF verursacht wird, wird es in der Regel als bewährte Methode angesehen, bei allen HttpPosts nach einem AntiForgeryToken zu suchen, es sei denn, es gibt einen guten Grund, dies nicht zu tun (technische Probleme mit dem Post, ein anderer Authentifizierungsmechanismus und / oder der post verändert den Zustand nicht wie das Speichern in eine Datenbank oder eine Datei). Um sicherzustellen, dass Sie nicht vergessen, können Sie einen speziellen GlobalActionFilter hinzufügen, der automatisch alle HttpPosts prüft, es sei denn, die Aktion wird mit einem speziellen Attribut "Ignorieren" versehen.
[AttributeUsage(AttributeTargets.Class)]
public class ValidateAntiForgeryTokenOnAllPosts : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
var request = filterContext.HttpContext.Request;
// Only validate POSTs
if (request.HttpMethod == WebRequestMethods.Http.Post)
{
bool skipCheck = filterContext.ActionDescriptor.IsDefined(typeof(DontCheckForAntiForgeryTokenAttribute), true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(DontCheckForAntiForgeryTokenAttribute), true);
if (skipCheck)
return;
// Ajax POSTs and normal form posts have to be treated differently when it comes
// to validating the AntiForgeryToken
if (request.IsAjaxRequest())
{
var antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName];
var cookieValue = antiForgeryCookie != null
? antiForgeryCookie.Value
: null;
AntiForgery.Validate(cookieValue, request.Headers["__RequestVerificationToken"]);
}
else
{
new ValidateAntiForgeryTokenAttribute()
.OnAuthorization(filterContext);
}
}
}
}
/// <summary>
/// this should ONLY be used on POSTS that DO NOT MUTATE STATE
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class DontCheckForAntiForgeryTokenAttribute : Attribute { }
Um sicherzustellen, dass alle Anforderungen geprüft werden, fügen Sie sie einfach Ihren globalen Aktionsfiltern hinzu
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//...
filters.Add(new ValidateAntiForgeryTokenOnAllPosts());
//...
}
}
Vorab-Verwendung: Wenden Sie für jeden POST-Standardfilter einen Antiforgery-Standardfilter an
Wir vergessen möglicherweise, das Antiforgery attribute
für jede POST
Anforderung anzuwenden, sodass wir es standardmäßig Antiforgery attribute
sollten. In diesem Beispiel wird sichergestellt, dass der Antiforgery filter
immer auf jede POST
Anforderung angewendet wird.
Erstellen AntiForgeryTokenFilter
zunächst einen neuen AntiForgeryTokenFilter
Filter:
//This will add ValidateAntiForgeryToken Attribute to all HttpPost action methods
public class AntiForgeryTokenFilter : IFilterProvider
{
public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
List<Filter> result = new List<Filter>();
string incomingVerb = controllerContext.HttpContext.Request.HttpMethod;
if (String.Equals(incomingVerb, "POST", StringComparison.OrdinalIgnoreCase))
{
result.Add(new Filter(new ValidateAntiForgeryTokenAttribute(), FilterScope.Global, null));
}
return result;
}
}
Registrieren Sie dann diesen benutzerdefinierten Filter bei MVC, Application_Start:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//Cactch generic error
filters.Add(new HandleErrorAttribute());
//Anti forgery token hack for every post request
FilterProviders.Providers.Add(new AntiForgeryTokenFilter());
}
}
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
Jetzt sind alle Ihre POST
Anforderungen standardmäßig mit Antiforgery-Attributen geschützt, sodass für jede POST-Methode kein Attribut [ValidateAntiForgeryToken]
mehr erforderlich ist.
Verwenden von AntiForgeryToken mit Jquery Ajax Request
Zuerst erstellen Sie das Formular
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
}
Aktionsmethode
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Test(FormViewModel formData)
{
// ...
}
Skript
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<script>
var formData = new FormData($('form')[0]);
$.ajax({
method: "POST",
url: "/demo/test",
data: formData ,
success: function (data) {
console.log(data);
},
error: function (jqXHR, textStatus, errorThrown) {
console.log(errorThrown);
}
})
</script>
Stellen Sie sicher, dass contentType auf nichts außer application/x-www-form-urlencoded
Wenn es nicht angegeben ist, verwendet Jquery standardmäßig application/x-www-form-urlencoded