SORU
2 AĞUSTOS 2012, PERŞEMBE


Nasıl ASP.NET Web API sağlamak için

Bir inşa etmek istiyorumDinlendiriciweb hizmeti ASP.NET Web kullanarak üçüncü parti geliştiriciler benim uygulama verilerine erişim için kullanacağı API.

Hakkında çok şey okudumOAuthve standart gibi görünüyor, ama belgelerine nasıl çalıştığını anlatan (ve bu gerçekten işe yarıyor!) ile iyi bir örnek bulmak inanılmaz zor (özellikle OAuth için bir acemi için) gibi görünüyor.

Aslında kurar ve çalışır ve bunu uygulamak için nasıl gösteren bir örnek var mı?

Sayısız örnekleri indirdim:

  • DotNetOAuth - Dokümantasyon acemi bir bakış açısından umutsuz
  • Thinktecture - inşa edemiyor

Ayrıca bloglar belirteci tabanlı basit bir düzeni (this)-Bu yeniden icat tekerlek gibi görünüyor düşündüren baktım ama kavramsal olmanın avantajı oldukça basit.

Ama iyi cevap bu gibi birçok soru var gibi görünmüyor.

Herkes bu alanda ne yapıyor?

CEVAP
2 AĞUSTOS 2012, PERŞEMBE


HMAC doğrulama Web Apı güvenli uygulamak başardık ve başarılı oldu. Temelde, HMAC doğrulama hem tüketici hem de sunucu karma bir mesaj hmac bilmek, HMAC256 kullanılması gereken her tüketici için gizli bir anahtar kullanır. Vakaların çoğu, tüketici karma parola gizli anahtar olarak kullanılır.

Mesajı normalde olabilir) HTTP isteği verileri, veya özelleştirilmiş veri bile inşa edilmiştir:

  1. Bu istek (UTC veya GMT time) gönderildiği zaman . zaman damgası:
  2. HTTP fiil: GET, POST, PUT, DELETE.
  3. post veri ve sorgu dizesi
  4. URL

Kaputun altında, HMAC doğrulama:

Tüketici server, imza (hmac esrar çıktı) oluşturduktan sonra web için HTTP isteği, HTTP istek şablonu gönderir:

User-Agent: {agent}   
Host: {host}   
Timestamp: {timestamp}
Authentication: {username}:{signature}

ALMAK için örnek istek:

GET /webapi.hmac/api/values

User-Agent: Fiddler    
Host: localhost    
Timestamp: Thursday, August 02, 2012 3:30:32 PM 
Authentication: cuongle:LohrhqqoDy6PhLrHAXi7dUVACyJZilQtlDzNbLqzXlw=

İmza almak için hash mesaj:

GET\n
Thursday, August 02, 2012 3:30:32 PM\n
/webapi.hmac/api/values\n

Sorgu dizesi ile SONRASI için örnek istek (imza altına doğru değil, sadece bir örnek)

POST /webapi.hmac/api/values?key2=value2

User-Agent: Fiddler    
Host: localhost    
Content-Type: application/x-www-form-urlencoded
Timestamp: Thursday, August 02, 2012 3:30:32 PM 
Authentication: cuongle:LohrhqqoDy6PhLrHAXi7dUVACyJZilQtlDzNbLqzXlw=

key1=value1&key3=value3

İmza almak için hash mesaj

GET\n
Thursday, August 02, 2012 3:30:32 PM\n
/webapi.hmac/api/values\n
key1=value1&key2=value2&key3=value3

Lütfen formu veri ve sorgu dizesi sunucu üzerinde kod ve veri doğru mesajı oluşturmak için form sorgu dizesi almak için olması gerektiğini unutmayın.

Ne zaman bir HTTP isteği geliyor sunucusu, bir kimlik doğrulama eylem filtre uygulanan ayrıştırma istek bilgi almak için: HTTP fiil, zaman damgası, uri, form verileri ve sorgu dizesi, o zaman göre bu yapı imzası (hmac karma) ile gizli anahtar (karma şifre) server.

Gizli anahtar isteği üzerine kullanıcı adı ile veritabanı var.

Sonra sunucu kodu eşit ise imza yerleşik isteği üzerine imza karşılaştırır, kimlik doğrulama geçirilir, aksi halde başarısız oldu.

Kodu imza oluşturmak için:

private static string ComputeHash(string hashedPassword, string message)
{
    var key = Encoding.UTF8.GetBytes(hashedPassword.ToUpper());
    string hashString;

    using (var hmac = new HMACSHA256(key))
    {
        var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
        hashString = Convert.ToBase64String(hash);
    }

    return hashString;
}

Nasıl replay saldırıyı önlemek için?

Zaman damgası için kısıtlama eklemek gibi bir şey

servertime - X minutes|seconds  <= timestamp <= servertime   X minutes|seconds 

(servertime: istek zaman sunucuya geliyor)

Ve, Tampon Bellek, istek imza (kullanım MemoryCache, zaman sınırı içinde tutmak gerekir). Eğer bir sonraki isteği önceki isteği ile aynı imza ile gelirse, reddedilecektir.

Demo kod olarak buraya koyun: https://github.com/cuongle/Hmac.WebApi

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ELawshea

    ELawshea

    26 Mayıs 2008
  • humanHardDrive

    humanHardDri

    16 Mart 2011
  • Justin Case

    Justin Case

    3 EKİM 2011