2009-08-11 5 views
5

Ich habe einen WCF-Dienst mit einer Sicherheitsklasse zum Abrufen einiger Attribute des aufrufenden Benutzers. Allerdings bin ich ziemlich schlecht in Sachen Fadensicherheit - bis zu diesem Punkt musste ich nicht viel damit anfangen und habe nur ein rudimentäres theoretisches Verständnis der Probleme des Multithreading.Ist dieser Code threadsicher? Wie kann ich es threadsicher machen?

die folgende Funktion gegeben:

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; 
    } 
} 

Gibt es eine Chance, dass etwas da drin schief gehen könnte, wenn das Verfahren zur gleichen Zeit von zwei verschiedenen Threads aufgerufen wird? In meinen Albträumen sehe ich schreckliche Konsequenzen, wenn diese Methoden schiefgehen, wie jemand, der versehentlich Daten von jemand anderem bekommt oder plötzlich ein Systemadministrator wird. Ein Kollege (der auch kein Experte war, aber er ist besser als ich) dachte, es wäre wahrscheinlich in Ordnung, weil dort nicht wirklich geteilte Ressourcen verfügbar sind.

Oder diese, die auf die Datenbank zugreifen - könnte das schief gehen?

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

Es gibt viele Diskussionen über die Prinzipien des threading, aber ich neige fallen und verwirren, wenn es darum geht, tatsächlich es die Anwendung, und zu wissen, wann es anzuwenden. Jede Hilfe wird geschätzt.

Ich kann mehr über den Kontext/Zweck dieser Funktionen erklären, wenn es nicht klar ist.

EDIT: Die rUser.GetByID() - Funktion ruft grundsätzlich zu einem Repository auf, das die Datenbank mit NHibernate nachschlägt. Also ich denke, die Datenbank hier ist eine "geteilte Ressource", aber nicht wirklich eine, die für diese Operation gesperrt oder geändert wird ... in diesem Fall denke ich, dass es in Ordnung ist ...?

+0

Danke, Erics. Ich fühle mich jetzt wohler. – Gavin

Antwort

12

Von dem, was ich sehe, greift das erste Beispiel nur Thread-lokalen Speicher und stack-basierte Variablen, während die zweite nur Stack-basierte Variablen zugreifen.

Beide sollten fadensicher sein.

Ich kann nicht sagen, ob GetByID Thread sicher ist oder nicht. Überprüfen Sie, ob es auf freigegebene/statische Ressourcen zugreift. Wenn dies der Fall ist, ist es nicht ohne zusätzlichen Code threadsicher, um diese Ressourcen zu schützen.

+0

Ich nehme Ihre Worte als die Wahrheit, und legen Sie alle Verantwortung für Sicherheitsverletzungen in meiner Anwendung an Ihrer Tür. :) – Gavin

+0

Bring it on :-D Sie sollten in Ordnung sein, vorausgesetzt GetByID ist auch threadsicher. –

3

Der Code, den Sie oben haben, enthält keinen Code, der globalen Status ändert, daher können Sie ziemlich sicher sein, dass es kein Problem sein wird, das von mehreren simlutane Threads aufgerufen wird. Die Sicherheitsprinzipaldaten sind an jeden Thread gebunden, also auch kein Problem.