2012-02-26 39 views
6

En un entorno donde unos 100 + usuarios inician sesión en un sitio con la autenticación formas, llamando HttpContext.Current.User.Identity.Name devuelve el usuario conectado correctamente .Problema con HttpContext.Current.User.Identity.Name

Sin embargo, el 10% de las veces se devuelve la información incorrecta del Nombre completo del usuario. Nunca tuve ese problema en mi máquina de prueba, solo ocurre en producción. No puedo recrear el mismo entorno con muchos usuarios en mi máquina de prueba.

La lógica de esta aplicación:

1) El usuario introduce nombre de usuario y pase, la información se busca a través de llamada SQL DB, si está partido, el usuario se autentica a través de FormsAuthentication.RedirectFromLoginPage (nombre de usuario, falsa)

FormsAuthentication.SetAuthCookie(user.SYS_Users_ID.ToString(), false); 

if (Request["ReturnURL"] == null) 
    FormsAuthentication.RedirectFromLoginPage(user.SYS_Users_ID.ToString(), false); 
else 
    Response.Redirect("/" + SysConfig.ApplicationName + appConfig.DefaultPages.DefaultPage); 

2) Después de redirección pongo el nombre completo del usuario en el campo oculto

if (!IsPostBack) 
    userFullName.Value = Helper.GetCurrentUserFullName(); 

... 

public static string GetCurrentUserFullName() 
{ 
    string _userFullName = string.Empty; 
    try 
    { 
     _userFullName = new AgrotMasofim.DAL.Users.Users().GetUserFullName(GetCurrentUserID()); 
    } 
    catch (Exception ex) 
    { 
     Logs.WriteToFileLog(string.Empty,ex); 
    } 
    return _userFullName; 
} 



public static Decimal GetCurrentUserID() 
     { 
      Decimal _userID = 0; 

      if (HttpContext.Current.User != null) 
      { 
       try 
       { 
        _userID = Convert.ToDecimal(HttpContext.Current.User.Identity.Name); 
       } 
       catch (Exception ex) 
       { 
        Logs.WriteToFileLog(string.Empty, ex); 
       } 
      } 
      return _userID; 
     } 

3) en todas las páginas que el usuario visita, su/h la información de er se muestra dentro de la etiqueta que está en la página maestra

lblUserName.Text = HttpUtility.HtmlDecode("Hello " + userFullName.Value); 

Esto funciona casi todo el tiempo. ¿Alguna idea de por qué podría estar fallando de de vez en cuando?

+1

Por favor, muéstrenos el código de su método 'GetCurrentUserFullName()'. – tvanfosson

+0

¿Qué quiere decir con información incorrecta? ¿Es el nombre de otra persona? ¿Está en blanco? – Aliostad

+0

¿Cómo se declara la variable userFullName? –

Respuesta

1

En ausencia de más código, solo puedo adivinar su problema. Como otras personas pueden encontrar su pregunta y tener problemas similares, supongo que su problema se debe a un uso incorrecto de clases o propiedades estáticas.

Su método GetCurrentUserFullName() puede confiar en un método de acceso a datos que se comparte estáticamente entre todos los hilos. Puede haber una condición de carrera en la (s) clase (s) de acceso a datos que a veces resulta en la identificación del usuario que se busca para ser reemplazado por el de otra solicitud antes de que se recuperen los datos. La solución a esto es (a) usar bloqueos en todas las secciones críticas de su (s) clase (s) de acceso a datos o (b) usar una solución que crea una nueva clase de acceso a datos para cada solicitud (realmente cada unidad de trabajo)) El último diseño requiere que su (s) clase (s) de acceso a los datos sea liviana, pero sería preferible ya que también será más fácil de probar.

También es posible, si almacena valores en caché en propiedades estáticas u otras clases estáticas que se compartirían entre subprocesos, que tiene una condición de carrera similar donde esos valores se almacenan en caché y se utilizan. Se aplicarían soluciones similares, utilizando bloqueo o uso de instancias por subproceso en lugar de instancias estáticas.

+0

Muchas gracias por la buena explicación, creo que sucede porque es un método estático, lo cambiaré. – Katya

+0

@ user1023623 Podría estar un nivel más abajo en 'GetCurrentUserID()' o dentro de DAL. En algún momento, tiene un método que hace referencia a una variable estática que se comparte entre subprocesos. Las variables locales deben ser seguras para subprocesos, ya que cada subproceso tiene su propia pila. – tvanfosson

+0

GetCurrentUserID() también es un método estático que devuelve HttpContext.Current.User.Identity.Name. ¿Puede devolver una Identidad.nombre incorrecta debido a esto? – Katya