REST API için kimlik doğrulaması tasarlama


11

Ben hem üretecek hem de tüketeceğim bir REST hizmeti için bir API çalışıyorum. Geçtiğimiz birkaç günü kimlik doğrulamanın nasıl güzel bir şekilde ele alınacağını anlamaya çalıştım ve sonunda bir şey bulduğumu düşünüyorum.

Ben uygulama yığını hakkında aşağıdaki gerçeklere dayanarak bu geliyorum:

  1. İstemci ve Sunucu .NET4'te (İstemci Profilindeki istemci bölümü)
  2. Sunucu, WCF REST kullanarak sunar
  3. Uygulamada kullanıcı adını ve şifreyi gerçekten bellekte tutmak istemiyorum

3'ten, kimlik doğrulama sunucusu tarafından doğrulandıktan sonra, istemci uygulamanın geri kalanında kullanmak üzere bir jeton alır (bu, örneğin başka şeyler yapmama izin verir) kullanıcıları zaman aşımına uğratmak, kullanıcıları web ve masaüstü sürümleri arasında sorunsuz bir şekilde taşımak vb. Aramaların tekrar oynatılmasını ve kurcalamaya karşı nasıl dayanıklı hale getirileceğini anladıktan sonra, aşağıdakileri buldum:

  1. İstemci kimlik doğrulaması yapmaya çalışmadan önce, ECDiffieHellmanCngsınıfı kullanarak bir Diffie-Hellman anahtar çifti oluşturur .
  2. Anahtar çiftinin ortak kısmını kullanıcı adı ve parola ile birlikte tel üzerinden gönderir (elbette HTTPS üzerinden).
  3. Sunucu, kullanıcı adı / parola kombinasyonunun kimliğini doğrular, başarılı olursa aşağıdakileri yapar:
    1. Benzersiz bir oturum jetonu oluşturur
    2. Kendi DH anahtar çiftini oluşturur ve istemci tarafından sağlanan ortak anahtardan paylaşılan sırrı hesaplar
    3. Oturum jetonunu, paylaşılan sırrı, kullanıcıyı ve veritabanındaki "son işlem" zamanını (yuvarlanan süre sonu penceresi için kullanılır) not eder
    4. Oturum belirtecini, genel DH anahtarını ve bir kimlik doğrulama başarılı iletisini döndürür
  4. İstemci DH anahtarını yanıttan alır, paylaşılan sırrı hesaplar ve hem jetonu hem de sırrı bellekte saklar.

Bu andan itibaren, oturum belirteci / gizli birleşimi, diğer parmakların çoğu REST API'leri gibi çalışır, istek parmak izi bırakılır ve zaman damgası eklenir ve ardından bir tür HMAC oluşturulur. İstemci sunucuya karşı bir eylem gerçekleştirdiğinde, belirteç / gizli çiftini kontrol eder ve geçerli ve süresi dolmamışsa eyleme izin verir ve oturumdaki son eylem kaydını günceller.

Açık bir kusur görmüyorum ve muhtemelen bunun için aşırı tasarlanmış, ancak bunu bir noktada nasıl yapacağımı öğrenmem gerekiyor. HMAC tekrar saldırılarını önler, DH anlaşması MITM saldırılarını önlemeye yardımcı olur (HMAC / DH arasında başımın üstünden uygulanabilir bir saldırı düşünemiyorum).

Herkes bu poke delik var mı?


DH anahtarları oluşturmanın, sadece her yerde HTTPS kullanmak ve düz eski oturum çerezi kullanmakla karşılaştırıldığında nasıl herhangi bir güvenlik sağladığını görmüyorum. Doğru kullanıldığında, HTTPS zaten ortadaki adam ve tekrar saldırılarına karşı koruma sağlar.
Lie Ryan

Yanıtlar:


5

Kendinizinkini icat etmek yerine, OpenAM API'sini okumayı ve ödünç almayı düşünmelisiniz.

http://forgerock.com/openam.html

OpenAM Wiki özellikle yardımcı olur

https://wikis.forgerock.org/confluence/display/openam/Home

Bileşenlerini kullanmanıza gerek yoktur. Ancak API'lerini kullanırsanız, uzun vadede hayatınızın daha kolay olacağını göreceksiniz.


Hmm, kötü görünmüyor, bu durumda kullanmamı engelleyen bir şey var: Biz bir .Net mağazasıyız. Ayrıca, WCF sunucu tarafı ile kullanmak hakkında çok fazla şey yok. Google'da bu konuda bulabildiğim spam olmayan bir bağlantı, WIF ve WS-Federation'u gösteriyor.
Matt Sieker

1
@Matt Sieker: "Bileşenlerini kullanmanıza gerek yok". Lütfen kendi URL'nizi icat etmek yerine API'larını okuyun.
S.Lott

Ah, ne demek istediğini anlıyorum, gereksinimler geri arama şeyler. Bu ilginç, bu proje için olmasa da gelecekteki projeler için daha fazlasını inceleyebilirim. Bir atomik yığın olarak kimlik doğrulaması yapmak yerine, onu biraz parçalayın, böylece sunucu istemciden ihtiyaç duyduğu şeyi kontrol edebilir ...
Matt Sieker

Başlangıçta kendimizi yuvarladık, ancak birkaç yıl önce IG Group'ta OpenAM'a taşındık. Açık kaynaklı üründen çok memnun.
Robert Morschel

2

@ S.Lott ile% 100 katılıyorum, kendi hesabınızı almak istemiyorsunuz. Başka bir alternatife bakmanızı öneririm: Windows Azure Erişim Denetim Hizmeti (ACS). ACS maliyettir, ancak çok ucuzdur (0.01 $ için 10.000 işlem) ve iyi bir altyapı ele alınır. WIF, istemciden yararlanır.

Bu aynı zamanda tüm öfke olan standartlara dayalı / taleplere dayalı bir çözümdür. WCF ve REST ve ACS'yi birlikte kullanma hakkındaki bu makaleye göz atın .

Geleceği düşünüyorsanız, bu aynı zamanda sizinle birlikte büyüyebilecek bir mekanizmadır - çünkü güvenlik duvarı, iş ortakları vb. Dışında mobil uygulamalarınız var. Güvenlik duvarınızın dışına bir bağımlılık kattığı için kullanmak istemeseniz bile, fikirler için kontrol etmek isteyebilirsiniz. Çok kaygan.

İyi şanslar! -Bill

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.