SORU
22 Mart 2013, Cuma


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
10 Mayıs 2013, Cuma


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jason Parker

    Jason Parker

    14 Aralık 2009
  • Liam Underwood

    Liam Underwo

    19 Mayıs 2009
  • Max Lee

    Max Lee

    18 AĞUSTOS 2006