asp.net mvc - mvc - Actualizar reclamo de usuario que no entra en vigor. ¿Por qué?
mvc 3 (3)
Estoy usando ASP.NET MVC 5.1 con la autenticación de Owin y Claims.
Después de que el usuario cambie su correo electrónico, necesito actualizar las notificaciones de los usuarios, así que lo intenté en el controlador:
ClaimsIdentity identity = (ClaimsIdentity)User.Identity;
Claim claim = identity.FindFirst(ClaimTypes.Email);
identity.RemoveClaim(claim);
identity.AddClaim(new Claim(ClaimTypes.Email, newEmail));
IOwinContext context = new OwinContext();
context.Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);
context.Authentication.SignIn(identity);
El Reclamo ha cambiado, pero cuando actualizo la página, el reclamo por correo electrónico vuelve a ser el original ...
Parece que la cookie no se está actualizando. ¿Alguna idea de lo que estoy haciendo mal?
¿Y es posible obtener el valor de "IsPersistent" de la identidad, de modo que cuando lo firme nuevamente tendré el mismo valor?
Gracias,
Miguel
Esto funciona para mi No estoy seguro si es la mejor manera pero la reclamación actualizada está en la base de datos y en los controladores posteriores.
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
var c = identity.Claims.FirstOrDefault(r => r.Type == "tId");
await UserManager.RemoveClaimAsync(user.Id, c);
await UserManager.AddClaimAsync(user.Id, new Claim("tId", "9032C945-DC5C-4FC9-BE7C-8EDC83A72E58"));
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, identity);
Tuve este mismo problema, así que solo quería resumir mis hallazgos aquí. Como dice Chris, la base de la respuesta es, de hecho, aquí: cómo cambiar las cookies de autenticación después de cambiar el nombre de usuario del usuario actual con la identidad de asp.net, pero este hilo es un poco difícil de seguir y esa pregunta no es realmente un duplicado directo .
Para comenzar, obtenga el AuthenticationManager del contexto OWIN actual. Una vez que tenga eso, puede obtener el valor de "isPersistent" (y otras propiedades de la llamada de SignIn
original), llamando al método AuthenticateAsync
. Luego, para actualizar los reclamos de la identidad de usuario actual, solo necesita reemplazar el valor de la propiedad AuthenticationResponseGrant
esta manera:
var identity = (ClaimsIdentity)User.Identity;
// Call AddClaim, AddClaims or RemoveClaim on the user identity.
IOwinContext context = Request.GetOwinContext();
var authenticationContext =
await context.Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie);
if (authenticationContext != null)
{
authenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant(
identity,
authenticationContext.Properties);
}
Es la configuración final de la propiedad AuthenticationResponseGrant
que realmente actualiza la cookie.
Espero que esto ayude a otros lectores.
Lo siento, esta es una solución de ASP.NET CORE . También desafié el problema con las reclamaciones, pero la respuesta fue fácil de encontrar.
Para actualizar su cookie, puede confiar en la función RefreshSignInAsync () del SignInManager;
private readonly UserManager<ApplicationUser> _userManager;
private readonly ApplicationDbContext _context;
private readonly SignInManager<ApplicationUser> _signInManager;
public ApiClubController(UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager, ApplicationDbContext context)
{
_userManager = userManager;
_context = context;
_signInManager = signInManager;
}
Dentro de su función:
//GET CURRENT USER
var usr = await GetCurrentUserAsync();
//OLD CLAIM
var myClaims = await _userManager.GetClaimsAsync(usr);
var oldClaim = myClaims.Where(o => o.Type.Equals("Club")).FirstOrDefault();
if (oldClaim != null)
{
await _userManager.RemoveClaimAsync(usr, oldClaim);
}
//CREATE CLUB CLAIM
var clubClaim = new Claim("Club", "" + id);
await _userManager.AddClaimAsync(usr, clubClaim);
//RESET USER COOKIE
await _signInManager.RefreshSignInAsync(usr);
//RETURN
return Ok(company);;
NOTA: Estoy usando una API aquí, porque me estoy mezclando mucho con angular. Si actualiza su identidad con su API, necesita actualizar su página para ver las cosas según su reclamo