2009-08-11 13 views
5

Tengo un servicio WCF con una clase de seguridad para obtener algunos de los atributos del usuario llamante. Sin embargo, soy bastante malo en lo que respecta a la seguridad de las hebras: hasta este punto, no he necesitado hacer mucho con eso, y solo tengo una comprensión teórica rudimentaria de los problemas del multihilo.¿Este código es seguro para subprocesos? ¿Cómo puedo hacer que sea seguro para subprocesos?

Dada la siguiente función:

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

¿Hay alguna posibilidad de que algo podría ir mal en allí si el método se ha llamado al mismo tiempo de 2 hilos diferentes? En mis pesadillas, veo consecuencias terribles si estos métodos salen mal, como si accidentalmente alguien obtuviera los datos de otra persona o de repente se convirtiera en un administrador del sistema. Un colega (que también no era un experto, pero es mejor que yo) pensó que probablemente estaría bien porque no hay realmente ningún recurso compartido al que se esté accediendo.

O este, que accederá a la base de datos, ¿podría salir mal?

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

Hay mucha discusión acerca de los principios de la rosca, pero tienden a caer hacia abajo y se confunden cuando se trata de aplicarlo realmente, y saber cuándo aplicarlo. Cualquier ayuda apreciada.

Puedo explicar más sobre el contexto/propósito de estas funciones si no está claro.

EDIT: La función rUser.GetByID() básicamente llama a un repositorio que busca la base de datos utilizando NHibernate. Entonces, supongo que la base de datos aquí es un "recurso compartido", pero no es realmente uno que se bloquee o modifique para esta operación ... ¿en cuyo caso creo que está bien ...?

+0

Gracias, Erics. Me siento más a gusto ahora. – Gavin

Respuesta

12

Según lo que veo, el primer ejemplo solo tiene acceso al almacenamiento local de subprocesos y las variables basadas en la pila, mientras que el segundo solo accede a variables basadas en la pila.

Ambos deben ser seguros para la rosca.

No sé si GetByID es seguro para subprocesos o no. Mire para ver si accede a cualquier recurso compartido/estático. Si lo hace, no es seguro para subprocesos sin algún código adicional para proteger esos recursos.

+0

Considero sus palabras como la verdad y asumo toda la responsabilidad por las violaciones de seguridad en mi solicitud en su puerta. :) – Gavin

+0

Actívelo :-D Debería estar bien suponiendo que GetByID también es seguro para subprocesos. –

3

El código que tiene arriba no contiene ningún código que cambie el estado global, por lo tanto, puede estar bastante seguro de que no habrá problemas para que varios subprocesos simultáneos lo invoquen. La información principal de seguridad está ligada a cada hilo, por lo que tampoco hay problema.

Cuestiones relacionadas