Pregunta

Hola, uso un MembershipProvider personalizado.

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

¿Me estoy perdiendo algo?

¿Fue útil?

Solución

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

El problema que tiene es que en este momento solo está configurando la cookie de autenticación, el IPrincipal que se crea dentro del módulo de autenticación de formularios no ocurrirá hasta que haya una nueva solicitud, por lo que en ese momento el HttpContext.User está en Un estado extraño. Una vez que se produce la redirección, como 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 establecen en el navegador después de completar una solicitud.

Como RedirectFromLoginPage crea una cookie de autenticación de formularios de todos modos, no es necesario que lo haga manualmente

Otros consejos

Intente System.Web.HttpContext.Current.Request.LogonUserIdentity.Name en lugar de User.Identity.Name. Funcionó para mí.

El valor de HttpContext.Current.User.Identity.Name se establece mediante la llamada a RedirectFromLoginPage. Puede obtener la identificación de usuario actual de <=> una vez que sea redirigido a una nueva página. No estoy seguro de por qué necesitaría acceder al nombre de usuario a través de la propiedad Usuario en este contexto, ¿no podría simplemente usar el valor contenido en tbUsername.Text?

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

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

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

Sin embargo, en mi caso, había anidado aplicaciones web en las que había borrado la etiqueta <httpModules> en la aplicación secundaria (para que no herede httpModules de su aplicación principal) en el archivo web.config. La eliminación de httpModules primarios no deseados hizo que todo volviera a funcionar.

es mejor verificar esta etiqueta antes de complicar las cosas :)

Si está buscando el nombre del usuario del proveedor de membresía, intente algo como esto ...

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

Si está utilizando la reescritura de URL o cambia su URL, puede ser causa de devolver un valor nulo vacío. Debe intentar cambiar la ruta de su URL de .html a .aspx o ninguna extensión. este es un problema para mi caso. Lo intentas. Espero que sea útil

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top