2009-06-29 39 views
23

Hola, yo uso un MembershipProvider personalizado.HttpContext.Current.User.Identity.Name siempre es string.Empty

Quiero saber el nombre de usuario actual durante un escenario de aplicación, pero cuando intento acceder a HttpContext.Current.User.Identity.Name, siempre devuelve string.Empty.

if (Membership.ValidateUser(tbUsername.Text, tbPassword.Text)) 
{ 
    FormsAuthentication.SetAuthCookie(tbUsername.Text, true); 
    bool x = User.Identity.IsAuthenticated; //true 
    string y = User.Identity.Name; //"" 
    FormsAuthentication.RedirectFromLoginPage(tbUsername.Text, cbRememberMe.Checked); 
} 

¿Falta algo?

+0

ese código parece bastante sencillo. ¿estás seguro de que el usuario está autenticado? ¿Algún negocio divertido con cambiar el proveedor dinámicamente o algo así? –

+0

no bizniz gracioso ,, el usuario está autenticado – Shimmy

+0

¿Ha establecido el nombre de usuario en la cookie de autenticación con FormsAuthentication.SetAuthCookie? –

Respuesta

34
FormsAuthentication.SetAuthCookie(tbUsername.Text, true); 
bool x = User.Identity.IsAuthenticated; //true 
string y = User.Identity.Name; //"" 

El problema que tiene es en este punto sólo se está configurando la cookie de autenticación, el IPrincipal que se crea en el interior del módulo de autenticación de formularios no ocurrirá hasta que haya una nueva solicitud - por lo que en ese momento el HttpContext . El usuario está en un estado extraño. Una vez que se produce la redirección, dado que se trata de una nueva solicitud del navegador, la cookie se leerá antes de que se llegue a su página y se cree el objeto de usuario correcto.

Las cookies solo se configuran en el navegador una vez que se completa una solicitud.

Como acotación al margen RedirectFromLoginPage crea una cookie de autenticación formas de todos modos, no es necesario hacerlo manualmente

+0

este es un buen punto. ¿Está probando el nombre de usuario en la misma página que establece la cookie/hace el inicio de sesión? de ser así, compruebe HttpContext.Current.User.Identity en una página * subsiguiente *. –

+0

muy buena respuesta. Pero esto no me ayuda mucho con mi problema. Quiero poder redirigir al usuario a una página en particular según el rol del usuario. Un administrador directamente al panel de administración, un usuario normal para dar la bienvenida a la página, un usuario avanzado a una página en particular ... Esperaba usar User.IsInRole() para determinar el ActionResult del método de acción LogOn ... pero está "en un estado extraño "como lo pones :-) –

0

Si usted está buscando el nombre del usuario del proveedor de pertenencia, intentar algo como esto ...

var user = Membership.GetUser(HttpContext.Current.User.Identity.Name); 
+2

Si necesito el usuario en lugar del nombre de usuario, entonces simplemente podría usar Membership.GetUser(); : <| – Shimmy

8

El valor de HttpContext.Current.User.Identity.Name se establece por la llamada a RedirectFromLoginPage. Puede obtener el ID de usuario actual desde HttpContext.Current.User.Identity.Name una vez que se le redirige a una página nueva. No estoy seguro de por qué necesitaría acceder al nombre de usuario a través de la propiedad del Usuario en este contexto, ¿no podría simplemente usar el valor contenido en tbUsername.Text?

19

Por favor, intente System.Web.HttpContext.Current.Request.LogonUserIdentity.Name en lugar de User.Identity.Name. Funcionó para mí

+1

Esto es algo diferente. Cuando leo este valor en mi sitio web, obtengo mi cuenta de Windows (AD) ... – Jowen

+1

Si User.Identity.Name está vacío y usted espera que no lo esté, pero LogonUserIdentity.Name no lo está, entonces puede que tenga un problema con su applicationhost.config si está eliminando errores de Visual Studio. Vea mi pregunta ASÍ para más información. http://stackoverflow.com/questions/19686933/logonuseridentity-name-vs-user-identity-name/19689343#19689343 – Jagd

+0

Sí, estoy de acuerdo con Jowen ... Esa no es la misma identidad que se solicitó ... pero es genial que sea accesible, supongo. – ppumkin

1

Como ya se sugirió el método FormsAuthentication.RedirectFromLoginPage(), establece la cookie de autenticación automáticamente.

Sin embargo, en mi caso, yo había anidado aplicaciones web en la que se había despejado <httpModules> etiqueta en la solicitud de niño (de modo que no hereda httpModules de su aplicación a los padres) en el archivo web.config. La eliminación de los httpModules originales no deseados hizo que todo vuelva a funcionar.

su mejor para comprobar esta etiqueta antes de complicar las cosas :)

0

Si está utilizando reescritura de URL o cambiar su dirección URL, puede ser causa de retorno nula vacío value.You debe tratar ruta cambio de su dirección URL desde. html a .aspx o ninguna extensión. este es un problema para mi caso. Intente. Espero que este útil

2

en la versión VS Community 2015, si crea una aplicación de formularios web, automáticamente agrega códigos en el nodo web.config para eliminar FormsAuthentication, intente eliminar a continuación la sección

<modules> 
    <remove name="FormsAuthentication"/> 
</modules> 
Cuestiones relacionadas