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)
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. –
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