2009-08-11 14 views
5

Mam usługę WCF z klasą zabezpieczeń dla niektórych atrybutów wywołującego użytkownika. Jednak jestem dość zły, jeśli chodzi o bezpieczeństwo nici - do tego momentu nie musiałem z nim wiele robić, a jedynie mam elementarne teoretyczne zrozumienie problemów związanych z wielowątkowością.Czy ten kod jest bezpieczny dla wątków? Jak mogę sprawić, by był bezpieczny dla wątków?

Biorąc pod uwagę następujące funkcję:

public class SecurityService 
{ 
    public static Guid GetCurrentUserID() 
    { 
     if (Thread.CurrentPrincipal is MyCustomPrincipal) 
     { 
      MyCustomIdentity identity = null; 
      MyCustomPrincipal principal = (MyCustomPrincipal)Thread.CurrentPrincipal; 
      if (principal != null) 
      { 
       identity = (MyCustomIdentity)principal.Identity; 
      } 

      if (identity != null) 
      { 
       return identity.UUID; 
      } 
     } 
     return Guid.Empty; 
    } 
} 

Czy jest jakaś szansa, że ​​coś może się nie udać się tam, jeśli metoda jest wywoływana w tym samym czasie od 2 różnych wątków? W moich koszmarach widzę straszne konsekwencje, jeśli te metody pójdą źle, jak ktoś przypadkowo pobierając dane kogoś innego lub nagle staje się administratorem systemu. Kolega (który też nie był ekspertem, ale jest lepszy ode mnie) myślał, że będzie to w porządku, ponieważ nie ma tam żadnych udostępnianych zasobów, które są tam dostępne.

Albo ten, który będzie miał dostęp do bazy danych - czy to może pójść nie tak?

public static User GetCurrentUser() 
    { 
     var uuid = GetCurrentUserID(); 
     if (uuid != null) 
     { 
      var rUser = new UserRepository(); 
      return rUser.GetByID(uuid); 
     } 
     return null; 
    } 

Istnieje wiele dyskusji na temat zleceniodawców gwintowania, ale staram się upaść i się mylić, jeśli chodzi o faktycznie jej stosowania, i wiedząc, kiedy je stosować. Każda pomoc doceniona.

Mogę wyjaśnić więcej o kontekście/celu tych funkcji, jeśli nie jest to jasne.

EDIT: Funkcja rUser.GetByID() wywołuje w zasadzie aż do repozytorium, które patrzy się z bazy danych przy użyciu NHibernate. Zakładam więc, że baza danych to "zasób współdzielony", ale nie taki, który zostanie zablokowany lub zmodyfikowany w tej operacji ... w takim razie wydaje mi się, że jest w porządku ...?

+0

Dzięki, Erics. Teraz czuję się bardziej swobodnie. – Gavin

Odpowiedz

12

Z tego, co widzę, pierwszy przykład tylko uzyskuje dostęp do zmiennych lokalnych i zmiennych opartych na stosie, podczas gdy drugi tylko uzyskuje dostęp do zmiennych opartych na stosie.

Obie powinny być zabezpieczone przed gwintem.

Nie mogę stwierdzić, czy GetByID jest bezpieczny dla wątków, czy nie. Sprawdź, czy ma dostęp do wszystkich zasobów współużytkowanych/statycznych. Jeśli tak, to nie jest wątek bezpieczny bez dodatkowego kodu do ochrony tych zasobów.

+0

Przyjmuję twoje słowa jako prawdę i ponoszę odpowiedzialność za naruszenia bezpieczeństwa w mojej aplikacji pod twoimi drzwiami. :) – Gavin

+0

Przynieś :-D Powinieneś być dobry zakładając, że GetByID jest bezpieczny dla wątków. –

3

Kod, który posiadasz powyżej, nie zawiera żadnego kodu, który zmienia stan globalny, więc możesz być dość pewny, że nie będzie problemu z wywołaniem przez wiele wtyczek symultanicznych. Informacje o głównych zabezpieczeniach są powiązane z każdym wątkiem, więc też nie ma problemu.

Powiązane problemy