Bu sorunun eski olduğunu anlıyorum, fakat burada okuduğum şeye dayanarak, benim için işe yaradığı düşünülen makul bir çözüm buldum. Kısmi şablonlar kullanan bir AngularJS SPA'sında kullanıyorum, bunların sadece bazıları POST gönderimlerini içeriyor. Iı (bir ajax veya angularjs POST örneğin,) formun antiforgery belirteci gereken yere sonra sadece başlıklarında '@formToken' içerir
@{
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;
}
}
ve:
bir görünümünün üst kısmında, bu kodu koymak çünkü: bu örnekte ben de alanları oluşturmadığı, başlıklarını dayalı anti-sahtecilik doğrulama uygulamak zorunda benim eylem yönteminden geri JSON verilerini bekliyorum
$http.post(route, JSON.stringify(args), {
headers: {
'@AntiForgeryConfig.CookieName': '@formToken',
'Content-Type': 'application/json; charset=utf-8',
},
});
Not. Bu konuda http://johan.driessen.se/posts/Updated-Anti-XSRF-Validation-for-ASP.NET-MVC-4-RC. numaralı güzel bir gönderi var.İşte uygulama görebilirsiniz:
[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]);
}
}
ve burada nasıl kullanıldıklarını açıklanmıştır:
[HttpPost]
[ValidateJsonAntiForgeryToken]
public JsonResult RecordVisit(VisitInfo info)
Ben sideeffect bilmem ama benim sorum herhangi bir html formu olmadan karmaşık js uygulaması hakkındadır. Form belirteci ve çerez belirteci almak için ajax isteği gönderiyorum, bundan sonra ajax isteğimi form belirteci ile gönderdim. Ancak şimdi, html önemsiz ayrıştırma yapmadan tanımlama bilgisi oluşturup form jetonu almanın güzel ve basit bir yolunu bilmiyorum. –
"HtmlHelper" öğesindeki oluşturulan anti-sahte form belirtecinin "Adını" ve "Değerini" açığa çıkarmanın, ExtJs çerçevesi gibi Javascript'te kullanılması gerektiğini buldum. Ben sadece HTML öğesi yazamıyorum, bunun yerine ExtJs bileşenini genişletmem ve istemci tarafı modeliyle ilgilenmem ya da sadece tüm girdi elemanının yerine isim ve değer gerektiren mevcut Gizli Alanı kullanmam gerekiyor ... 'AntiForgery.GetTokens': kurabiye ile oynamak; 'AntiForgery.Validate': Zaten dahili olarak [ValidateAntiForgeryToken] özniteliği tarafından çağrıldı ... Ben isim ve değer almak için OP HtmlHelper uzantısı kullanarak endup. – CallMeLaNN