2013-02-17 11 views
20

@ Html.AntiForgeryToken() gizli girişnasıl gizli girişi olmadan AntiForgeryToken değeri elde etmek

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

nasıl göstermelik bir değer elde edebilirsiniz vermektedir? tek bir gizli form öğedir ve diğer bir çerez: MVC

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)); 
    } 

cevap

13

karşıtı CSRF yetenekleri aslında iki jeton bağlıdır: Böyle çirkin kodu olmadan . Bu nedenle, Html.AntiForgeryToken() yardımcı bir HTML snippet'ini döndürmez. Ayrıca, bu çerezi ayarlamanın bir yan etkisi de vardır. Çerez değeri ve form değerinin her biri farklı bilgi parçalarını kodladığı için eşit olmadığına dikkat edin.

AntiForgery.GetTokens API'sini kullanırsanız, bu yöntem bir HTML pasajı oluşturmak yerine ham jetonları döndürür. Bu yöntemin parametreler şunlardır:

  • oldCookieToken: istek zaten bir anti-CSRF çerez simge içeriyor, burada bunu sağlamak. Bu parametre boş olabilir.
  • newCookieToken (dışarı parametresi): oldCookieToken boş olduğunu veya geçerli bir anti-CSRF çerez belirteci temsil etmediğini, bu parametre tepki çerezindeki koymalıyız değerle doldurulur. oldCookieToken geçerli bir anti-CSRF belirtecini temsil ediyorsa, newCookieToken yöntemi döndürdüğünde null değerini içerir ve bir yanıt tanımlama bilgisi oluşturmanız gerekmez.
  • formToken (çıkış parametresi): Bu parametre, sunucuya geri gönderirken form gövdesinde bulunması gereken simge ile doldurulur. Bu, Html.AntiForgeryToken() öğesine yapılan bir çağrıda gizli giriş öğesi tarafından sarılmış olan değerdir. el çerez ve form belirteçleri oluşturmak için bu API kullanırsanız

, sen belirteçleri doğrulamak amacıyla AntiForgery.Validate arasında the corresponding overload aramak gerekir.

+3

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

+3

"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

10

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) 
İlgili konular