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 ...?
Gracias, Erics. Me siento más a gusto ahora. – Gavin