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)