Saltar al contenido

¿Cómo actualizar un reclamo en ASP.NET Identity?

Posterior a de una larga recopilación de información hemos podido solucionar este atolladero que presentan algunos usuarios. Te brindamos la respuesta y deseamos servirte de gran apoyo.

Solución:

Creé un método de extensión para agregar/actualizar/leer reclamos en función de una ClaimsIdentity dada

namespace Foobar.Common.Extensions

    public static class Extensions
    
        public static void AddUpdateClaim(this IPrincipal currentPrincipal, string key, string value)
        
            var identity = currentPrincipal.Identity as ClaimsIdentity;
            if (identity == null)
                return;

            // check for existing claim and remove it
            var existingClaim = identity.FindFirst(key);
            if (existingClaim != null)
                identity.RemoveClaim(existingClaim);

            // add new claim
            identity.AddClaim(new Claim(key, value));
            var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
            authenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant(new ClaimsPrincipal(identity), new AuthenticationProperties()  IsPersistent = true );
        

        public static string GetClaimValue(this IPrincipal currentPrincipal, string key)
        
            var identity = currentPrincipal.Identity as ClaimsIdentity;
            if (identity == null)
                return null;

            var claim = identity.Claims.FirstOrDefault(c => c.Type == key);
            return claim.Value;
        
    

y luego a usarlo

using Foobar.Common.Extensions;

namespace Foobar.Web.Main.Controllers

    public class HomeController : Controller
    
        public ActionResult Index()
        
            // add/updating claims
            User.AddUpdateClaim("key1", "value1");
            User.AddUpdateClaim("key2", "value2");
            User.AddUpdateClaim("key3", "value3");
        

        public ActionResult Details()
        
            // reading a claim
            var key2 = User.GetClaimValue("key2");          
        
    

Puedes crear un nuevo ClaimsIdentity y luego actualice las reclamaciones con tales.

set 
    // get context of the authentication manager
    var authenticationManager = HttpContext.GetOwinContext().Authentication;

    // create a new identity from the old one
    var identity = new ClaimsIdentity(User.Identity);

    // update claim value
    identity.RemoveClaim(identity.FindFirst("AccountNo"));
    identity.AddClaim(new Claim("AccountNo", value));

    // tell the authentication manager to use this new identity
    authenticationManager.AuthenticationResponseGrant = 
        new AuthenticationResponseGrant(
            new ClaimsPrincipal(identity),
            new AuthenticationProperties  IsPersistent = true 
        );

Otro enfoque (asincrónico), utilizando UserManager y SigninManager de Identity para reflejar el cambio en la cookie de Identity (y, opcionalmente, eliminar las reclamaciones de la tabla db AspNetUserClaims):

// Get User and a claims-based identity
ApplicationUser user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
var Identity = new ClaimsIdentity(User.Identity);

// Remove existing claim and replace with a new value
await UserManager.RemoveClaimAsync(user.Id, Identity.FindFirst("AccountNo"));
await UserManager.AddClaimAsync(user.Id, new Claim("AccountNo", value));

// Re-Signin User to reflect the change in the Identity cookie
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);

// [optional] remove claims from claims table dbo.AspNetUserClaims, if not needed
var userClaims = UserManager.GetClaims(user.Id);
if (userClaims.Any())

  foreach (var item in userClaims)
  
    UserManager.RemoveClaim(user.Id, item);
  

Comentarios y calificaciones

Finalizando este artículo puedes encontrar las explicaciones de otros administradores, tú igualmente tienes la opción de dejar el tuyo si te gusta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *