2015-10-20 46 views
14

Obecnie przechowujemy użytkowników naszej aplikacji internetowej w naszej bazie danych wraz z hashe/solami ich haseł. Hashy są obliczane, gdy użytkownik jest tworzony i ustawia swoje hasło i przechowywane w tabeli użytkownika w bazie danych.Czy można obliczyć skrót hasła używany przez usługę Active Directory?

Jakiś czas po utworzeniu konta użytkownika możemy chcieć utworzyć konto systemu Windows w naszej domenie i chcieć ustawić hasło użytkownika domeny, aby było takie samo, jak hasło używane do logowania do aplikacji internetowej. Ponieważ nie zapisujemy wersji hasła w postaci zwykłego tekstu, nie mamy sposobu, aby wysłać ją do AD, gdy ją stworzyliśmy.

Jednym ze sposobów, w jaki myślałem o obejściu tego problemu, byłoby obliczenie wszystkich skrótów haseł używanych przez AD, gdy użytkownik po raz pierwszy ustawi hasło, a następnie jakoś ustawi rekordy w AD później, gdy utworzymy użytkownika.

  1. Jak utworzyć hasze (myślę, że są to MD4, MD5 i DES), używając .Net?
  2. Czy można pominąć tworzenie hasła w UserPrincpal.SetPassword i wykonać inne połączenie w celu bezpośredniego ustawienia skrótów przechowywanych przez AD?

Wygląda na to, że powinien istnieć sposób, aby to zrobić, ponieważ MS ma narzędzia do synchronizacji haseł od AD do użytkowników Azure.

+0

Interesujące pytanie, ale myślę, że to zadziała tylko wtedy, gdy użyjesz tej samej soli co Windows?!? A z perspektywy bezpieczeństwa: czy dobrze jest mieć to samo hasło w obu systemach?Powiedziałbym, że to, czego szukasz, to pojedynczy znak na rozwiązaniu. – Marged

+0

Problem polega na tym, o ile mi wiadomo, że system Windows nie działa dobrze z pojedynczym logowaniem, chyba że jest to "pojedynczy" punkt do wpisania się. W jakiś sposób MS ma narzędzia do synchronizacji haseł, więc uważam, że musi to być możliwe. – bpeikes

+0

W zależności od tego, gdzie jest uruchomiona aplikacja internetowa, możesz używać SSO przy użyciu różnych technik: SAML, Kerberos, certyfikaty. Staraj się jednak wdrożyć synchronizację i nie zapomnij o implikacjach związanych z bezpieczeństwem. Pierwsze S w SSO czasami jest bardziej "ciche" niż pojedyncze ;-) – Marged

Odpowiedz

5

Starając się zachować hasło AD zsynchronizowane z hasłem DB jest to zły pomysł z dwóch powodów:

  • Jest to słabość zabezpieczeń (komentarze już wskazywał na to, wspominając sól)
  • To jest utrzymanie problem. Zmiana hasła zainicjowana przez komputer z systemem Windows pozostawi hasło DB bez zmian.

zamiast tworzenia okna konta z tym samym hasłem, zmieniać uwierzytelnienia aplikacji internetowej do korzystania zarówno uwierzytelnianie AD i Windows Forms uwierzytelniania. W ten sposób ich poświadczenia AD (jeśli je mają) zastąpią monit o podanie nazwy użytkownika/hasła.

+0

Tak. Op może ustawić flagę w bazie danych po utworzeniu konta AD. Następnie użyj tej flagi, aby określić, czy uwierzytelnić się w bazie danych, czy przeciwko AD. Jednym z bardzo łatwych sposobów uwierzytelnienia przeciwko AD (* w przypadku odpowiedzialnego i bezpiecznego *) jest [PrincipalContext.ValidateCredentials Method] (https://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.principalcontext. validatecredentials (v = vs.110) .aspx) klasy [AccountManagement] (https://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement (v = vs.110) .aspx). +1 za odpowiedź :) – Abhitalks

0

Unikając posiadania a) zaszyfrowanego hasła, do którego można uzyskać powrót tekstu jawnego, b) słabego skrótu, są to złe pomysły na wypadek naruszenia bezpieczeństwa bazy danych przez wewnętrznego/zewnętrznego napastnika.

Można rozważyć inne podejście: * utworzyć konto AD dla użytkownika z długim, losowym, nieznanym hasłem. Umieść znacznik czasu "ADPasswordLastSet = null" na koncie. * następnym razem, gdy użytkownik zaloguje się do twojej aplikacji internetowej, po uwierzytelnieniu ich, masz hasło w jasnym, więc ustaw hasło użytkownika AD do tego samego. Nie zapomnij zaktualizować flagi ADPasswordLastSet.

Dlatego nie musisz nigdzie wpisywać hasła, jeśli możesz ustawić je synchronicznie.

Jedna rzecz do zapamiętania: zasady złożoności haseł - chcesz się upewnić, że zasady obecne w interfejsie, z którym współpracuje użytkownik, mają bardziej rygorystyczne zasady.