c# - User.Identity.IsAuthenticated es falso después de iniciar sesión correctamente
asp.net asp.net-membership (4)
En mi caso de entorno de desarrollo, la propiedad requireSSL se estableció en true, solucioné el problema cambiándolo a requireSSL = false
Necesito obtener el UserId Guid directamente después de un inicio de sesión exitoso. El siguiente código no funciona:
if (Membership.ValidateUser(txtUsername.Value, txtPassword.Value))
{
FormsAuthentication.SignOut();
FormsAuthentication.SetAuthCookie(txtUsername.Value, true);
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
// doesn''t run
Guid puk = (Guid)Membership.GetUser().ProviderUserKey;
}
}
El siguiente código funciona:
if (Membership.ValidateUser(txtUsername.Value, txtPassword.Value))
{
FormsAuthentication.SignOut();
FormsAuthentication.SetAuthCookie(txtUsername.Value, true);
MembershipUser user = Membership.GetUser(txtUsername.Value);
if (user != null)
{
Guid puk = (Guid)user.ProviderUserKey;
}
}
¿Por qué pasó esto? ¿Hay algo más que hacer además de SetAuthCookie
?
Porque cuando llamas a FormsAuthentication.SetAuthCookie(txtUsername.Value, true);
Usted almacena la clave en las cookies del cliente. Para esto necesitas hacer una respuesta al usuario. Y para que HttpContext.Current.User.Identity
se complete con una cookie, necesita una solicitud más.
En resumen, su esquema se ve así:
El cliente envía su nombre de usuario y contraseña.
El servidor lo consigue y lo comprueba. Si son válidos, el servidor envía el encabezado
Set-Cookie
al cliente.El cliente lo recibe y lo almacena. Para cada solicitud el cliente envía las cookies al servidor.
ACTUALIZACIÓN para @Jake
Agregando un ejemplo de configuración de User
en HttpContext
var identity = new System.Security.Principal.GenericIdentity(user.UserName);
var principal = new GenericPrincipal(identity, new string[0]);
HttpContext.Current.User = principal;
Thread.CurrentPrincipal = principal;
Tenga en cuenta que puede crear su clase principal personalizada GenericPrincipal
de GenericPrincipal
o ClaimsPrincipal
Probé todas las soluciones anteriores, pero lo que resuelve mi problema fue comentar esto en web.config
<modules>
<remove name="FormsAuthentication"/>
</modules>
Yo también tuve el mismo problema. Olvidé configurar la configuración web.config.
Tal vez te perdiste también.
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/user/login" timeout="1000" name="__Auth" />
</authentication>
</system.web>