2009-01-29 10 views
10

Reorganizuję działającą aplikację sieci Web ASP.NET, aby udostępnić interfejs usług sieci Web przy użyciu usługi sieci Web ASP.NET. Według Web Services authentication - best practices, podstawowa autoryzacja przez https jest drogą do zrobienia. Załóżmy, że jest to, w przeciwieństwie do WS-Security, X509, itp.Niestandardowe uwierzytelnianie HTTP dla usług sieci Web ASP.NET w .NET 3.5/VS 2008

Na .NET 3.5/VS 2008, jaki jest najprostszy sposób wdrożenia niestandardowego uwierzytelniania podstawowego http (nie-Windows), na przykład, akceptowanie tylko wtedy, gdy nazwa użytkownika to "foo", a hasło to "bar". Ostatecznie, chciałbym ustawić Thread.CurrentPrincipal.

Czy mogę napisać własną HttpModule lub czy można to zrobić łatwiej?

Odpowiedz

5

Najprawdopodobniej przy użyciu Custom Basic Authentication for IIS, napisany przez Dominick Baier jest do zrobienia. As he points out Nazwy użytkowników WCF 3.5 nad zabezpieczeniami transportu nie mogą być używane w usługach hostowanych przez IIS, chociaż moje pytanie dotyczyło usług ASP.NET Web Services, a nie WCF.

Istnieje inna implementacja modułu HTTP o nazwie Basic authentication in ASP.NET against custom datasource autorstwa Santosh Sahoo.

Mimo że nie było to, co chciałem, znalazłem QuickStart Tutorial's SOAP Headers sample jako informatywne obejście. Wysyłanie hasła w postaci zwykłego tekstu przez HTTP jest wyraźnie niebezpieczne, ale ten przykład może zostać rozszerzony w celu zwiększenia bezpieczeństwa, na przykład na https lub wysyłania hasha "hasło + jednorazowy identyfikator GUID + znacznik czasu".

1

Jeśli rozważasz WCF, możesz użyć zabezpieczenia usernameOverTransport dla basicHttpBinding. tj. nazwa użytkownika i hasło znajdują się w nagłówku SOAP żądania, a cały ruch jest chroniony szyfrowaniem SSL przez przewód.

Niestandardowego walidatora UserNamePasswordValidator można użyć do uwierzytelnienia przychodzących poświadczeń przed np. Baza danych.

Można ustawić główny wątek w niestandardowej IAuthorizationPolicy w zachowaniu usługi.

np. Ocenia wdrożenie metody dla IAuthorizationPolicy do ustawiania aktualnej Principal

public bool Evaluate(EvaluationContext evaluationContext, ref object state) 
{ 
     Object obj; 
     if(evaluationContext.Properties.TryGetValue("Identities", out obj)) 
     { 
      // get the authenticated identity 
      IIdentity client = (obj as IList<IIdentity>)[0]; 
      evaluationContext.Properties["Principal"] = ... // create principal obj here for the identity 
      // this will set thread's current principal 
     } 
     return true; 
} 
+0

Chcę użytkownika i hasło w nagłówku http, a nie nagłówek SOAP. Również nazwa użytkownika nad transportem nie działa na IIS: http://www.leastprivilege.com/WCFUsernamesOverTransportAndIISHosting.aspx –

+0

usernameOverTransport dla basicHttpBinding z pewnością działa nawet hostowane w IIS, mam rozwiązanie wdrożone do produkcji jakiś czas temu. należy pamiętać, że nie jest to uwierzytelnianie podstawowe skonfigurowane w IIS. jest na poziomie wiadomości mydlanych. –

3

pobieramy wartość nagłówka Authorization, analizować je i walidacji użytkownik/hasło.

Wartość to nazwa użytkownika: hasło zakodowane jako ciąg Base64.

Aby uzyskać szczegółowe informacje, patrz http://en.wikipedia.org/wiki/Basic_access_authentication.

Edit: jeśli chcesz to zrobić dla każdego żądania, za pomocą schematu uwierzytelniania, wtedy łatwiej byłoby napisać HttpModule obsłużyć analizowania nagłówka i ustawienie głównego wątku za.

Powiązane problemy