Asp.Net karşı açısal, sunucuda WebApi uygulamak CSRF.
ASP.NET WebAPİ bir arka uç isabet eden angular.js bir web sitesi oluşturuyorum.
Angular.js dahili özellikleri anti-csrf koruması ile yardımcı olmak için vardır. Her http isteği üzerine, bir çerez olarak adlandırılan arayacaktır "XSRF-TOKEN" ve bir başlık olarak gönderin "X-XSRF-TOKEN" .
Bu web sunucusu üzerinde kullanıcı kimlik doğrulaması ve ardından gelen istekleri X-XSRF-TOKEN Başlığı kontrol ettikten sonra XSRF-TOKEN çerez ayarlamak için güçlü olmak dayanır.
Angular documentation devletler:
Bu yararlanmak için, sunucu JavaScript okunabilir bir oturum belirteci kurabiye XSRF-TOKEN denilen ilk HTTP isteği ayarlamak gerekiyor. Sonraki olmayan sunucu çerez eşleştiğini doğrulayın istekleri X-XSRF-TOKEN HTTP üstbilgi ve bu nedenle sadece JavaScript alanınızda çalışan token okumuş olabileceğinden emin olun. Token her kullanıcı için benzersiz olmalıdır ve sunucu (JavaScript kendi simgeleri oluşturan önlemek için) tarafından doğrulanabilir olmalıdır. Belirteç fazla güvenlik için tuz ile sitenizin kimlik doğrulama tanımlama bilgisi bir özeti öneririz.
Çeşitli kaynaklardan yardım ile benim kendi rulo yaptım ASP.NET WebAPİ için bu iyi bir örnek bulamadım. Sorumu kimse bir şey kod ile yanlış görüyor?
İlk olarak basit bir Yardımcı Sınıf ben de getirir
public class CsrfTokenHelper
{
const string ConstantSalt = "<ARandomString>";
public string GenerateCsrfTokenFromAuthToken(string authToken)
{
return GenerateCookieFriendlyHash(authToken);
}
public bool DoesCsrfTokenMatchAuthToken(string csrfToken, string authToken)
{
return csrfToken == GenerateCookieFriendlyHash(authToken);
}
private static string GenerateCookieFriendlyHash(string authToken)
{
using (var sha = SHA256.Create())
{
var computedHash = sha.ComputeHash(Encoding.Unicode.GetBytes(authToken ConstantSalt));
var cookieFriendlyHash = HttpServerUtility.UrlTokenEncode(computedHash);
return cookieFriendlyHash;
}
}
}
O zaman izin benim denetleyicisi aşağıdaki yöntem ve FormsAuthentication diyorum sonra diyorum.() SetAuthCookie:
// http://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-(csrf)-attacks
// http://docs.angularjs.org/api/ng.$http
private void SetCsrfCookie()
{
var authCookie = HttpContext.Current.Response.Cookies.Get(".ASPXAUTH");
Debug.Assert(authCookie != null, "authCookie != null");
var csrfToken = new CsrfTokenHelper().GenerateCsrfTokenFromAuthToken(authCookie.Value);
var csrfCookie = new HttpCookie("XSRF-TOKEN", csrfToken) {HttpOnly = false};
HttpContext.Current.Response.Cookies.Add(csrfCookie);
}
Sonra denetleyicileri için onları csrf Başlığı kontrol yapmak için ekleyebilirim olan özel bir nitelik var:
public class CheckCsrfHeaderAttribute : AuthorizeAttribute
{
// http://stackoverflow.com/questions/11725988/problems-implementing-validatingantiforgerytoken-attribute-for-web-api-with-mvc
protected override bool IsAuthorized(HttpActionContext context)
{
// get auth token from cookie
var authCookie = HttpContext.Current.Request.Cookies[".ASPXAUTH"];
if (authCookie == null) return false;
var authToken = authCookie.Value;
// get csrf token from header
var csrfToken = context.Request.Headers.GetValues("X-XSRF-TOKEN").FirstOrDefault();
if (String.IsNullOrEmpty(csrfToken)) return false;
// Verify that csrf token was generated from auth token
// Since the csrf token should have gone out as a cookie, only our site should have been able to get it (via javascript) and return it in a header.
// This proves that our site made the request.
return new CsrfTokenHelper().DoesCsrfTokenMatchAuthToken(csrfToken, authToken);
}
}
Son olarak, kullanıcı oturumu zaman Csrf token ben açık:
HttpContext.Current.Response.Cookies.Remove("XSRF-TOKEN");
Herkes bu yaklaşım ile (ya da değil-öylesine-belirgin) herhangi bir bariz sorunları nokta olabilir?
CEVAP
Sizin kod iyi olacak gibi görünüyor. Tek şey, web olduğunuz kod en ihtiyacın yok.apı çalışır "üstüne" asp.net mvc ve ikinci anti-sahtecilik için yerleşik destek vardır belirteçleri.
http://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-(csrf)-attacks
Ayrıca bu soru AngularJS can't find XSRF-TOKEN cookie bir göz atın

Onay sunucuda dosya karşı diff...
Şartlı Açısal öznitelikleri uygulamak ...
Giriş formları CSRF saldırılarına karş...
Python programlama sekmeleri karşı ala...
Nasıl düzgün özel kullanımına ve const...