2013-02-17 11 views
20

@ Html.AntiForgeryToken() renderuje ukryte wejścieJak uzyskać wartość AntiForgeryToken bez ukrytego wejścia

<input name="__RequestVerificationToken" type="hidden" value="GuiNIwhIJZjINHhuS_8FenaFDXIiaE" /> 

Jak mogę uzyskać tylko wartość symboliczną? Bez brzydkiego kodu:

public static IHtmlString AntiForgeryTokenValue(this HtmlHelper htmlHelper) { 
     var field = htmlHelper.AntiForgeryToken().ToHtmlString(); 
     var beginIndex = field.IndexOf("value=\"") + 7; 
     var endIndex = field.IndexOf("\"", beginIndex); 
     return new HtmlString(field.Substring(beginIndex, endIndex - beginIndex)); 
    } 

Odpowiedz

13

Możliwości anty-CSRF MVC rzeczywiście zależą dwa tokeny: jeden jest ukryty element formularza, a druga jest ciasteczko. Dlatego Helper Html.AntiForgeryToken() nie zwraca po prostu fragmentu kodu HTML. Ma również efekt uboczny ustawienia tego pliku cookie. Należy pamiętać, że wartość cookie i wartość formularza nie są równe, ponieważ kodują różne informacje.

Jeśli używasz interfejsu API AntiForgery.GetTokens, ta metoda zwróci surowe tokeny zamiast generowania fragmentu kodu HTML. Parametry tej metody są:

  • oldCookieToken: Jeżeli wniosek zawiera już plik cookie żeton anty-CSRF, dostarczenie go tutaj. Ten parametr może mieć wartość NULL.
  • newCookieToken (parametr wyjściowy): Jeśli oldCookieToken był zerowy lub nie stanowią ważny anty-CSRF cookies żeton, ten parametr zostanie wypełniona wartości, które należy umieścić w pliku cookie odpowiedzi. Jeśli oldCookieToken reprezentuje prawidłowy token anty-CSRF, to wtedy newCookieToken będzie zawierać wartość NULL, gdy metoda zwróci i nie trzeba ustawiać pliku cookie odpowiedzi.
  • formToken (parametr wyjściowy): Ten parametr zostanie zapełniony tokenem, który powinien być obecny w treści formularza podczas wysyłania z powrotem do serwera. Jest to wartość, która kończy się opakowaniem przez ukryty element wejściowy w wywołaniu funkcji Html.AntiForgeryToken().

Jeśli używasz tego API do ręcznego generowania plików cookie i formularza tokeny, musisz zadzwonić the corresponding overload z AntiForgery.Validate w celu sprawdzenia żetony.

+3

wiem o sideeffect, ale moje pytanie jest o skomplikowanej js aplikacji bez jakiejkolwiek formie html. Wysyłam żądanie ajax, aby uzyskać token formularza i tokena cookie, po czym wysyłam moją prośbę ajaxową za pomocą tokena formularza. Ale teraz nie wiem ładny i prosty sposób ustawić plik cookie i uzyskać tokena formularza bez parsowania html śmieci. –

+3

Zauważyłem, że odsłanianie "Nazwa" i "Wartość" generowanego tokena formularza fałszerstwa w 'HtmlHelper' jest niezbędna do użycia w JavaScript jak framework ExtJs. Nie mogę po prostu napisać elementu HTML, zamiast tego muszę rozszerzyć komponent ExtJs i poradzić sobie z modelem po stronie klienta lub użyć istniejącego Hiddenfield, które wymaga tylko nazwy i wartości zamiast całego elementu wejściowego ... 'AntiForgery.GetTokens': require to baw się z ciasteczkiem; 'AntiForgery.Validate': Już wewnętrznie wywoływana przez atrybut [[ValidateAntiForgeryToken]' ... przy korzystaniu z rozszerzenia OP HtmlHelper uzyskuję nazwę i wartość. – CallMeLaNN

10

Zdaję sobie sprawę, że to pytanie jest stare, ale na podstawie tego, co tu przeczytałem wymyśliłem dość proste rozwiązanie, które wydaje się działać dla mnie. Używam go w AngularJS SPA, który korzysta z częściowych szablonów, z których tylko niektóre zawierają zgłoszenia POST.

umieścić ten kod na szczycie widzenia:

@{ 
    string cookieToken, formToken; 
    string oldCookieToken = Request.Cookies[AntiForgeryConfig.CookieName] == null ? null : Request.Cookies[AntiForgeryConfig.CookieName].Value; 
AntiForgery.GetTokens(oldCookieToken, out cookieToken, out formToken); 

    if(oldCookieToken == null) 
    { 
     Request.Cookies.Add(new HttpCookie(AntiForgeryConfig.CookieName,  cookieToken)); 
    } 
    else 
    { 
     Request.Cookies[AntiForgeryConfig.CookieName].Value = cookieToken; 
    } 
} 

a potem gdziekolwiek muszę zabezpieczającym żeton postaci (np, w AJAX lub angularjs POST) Właśnie to „@formToken” w nagłówkach :

$http.post(route, JSON.stringify(args), { 
    headers: { 
     '@AntiForgeryConfig.CookieName': '@formToken', 
     'Content-Type': 'application/json; charset=utf-8', 
    }, 
}); 

Zauważ, że w tym przykładzie Czekam danych JSON z powrotem z mojego metody działania miałem również do wdrożenia walidacji przeciw fałszerstwom na podstawie nagłówków, nie tworzą pola. Jest ładny post o tym pod adresem http://johan.driessen.se/posts/Updated-Anti-XSRF-Validation-for-ASP.NET-MVC-4-RC..Oto realizacja:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, 
       AllowMultiple = false, Inherited = true)] 
public sealed class ValidateJsonAntiForgeryTokenAttribute 
          : FilterAttribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if(filterContext == null) 
     { 
      throw new ArgumentNullException("filterContext"); 
     } 

     var httpContext = filterContext.HttpContext; 
     var cookie = httpContext.Request.Cookies[AntiForgeryConfig.CookieName]; 
     AntiForgery.Validate(cookie != null ? cookie.Value : null, 
          httpContext.Request.Headers[AntiForgeryConfig.CookieName]); 
    } 
} 

i oto jak to działa:

[HttpPost] 
    [ValidateJsonAntiForgeryToken] 
    public JsonResult RecordVisit(VisitInfo info) 
Powiązane problemy