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



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow