Update User Claim not Taking Effect. Why?

后端 未结 3 635
误落风尘
误落风尘 2020-12-08 15:29

I am using ASP.NET MVC 5.1 with Owin and Claims authentication.

After the user changes its email I need to update the users claims, so I tried in the controller:

相关标签:
3条回答
  • 2020-12-08 16:09

    SORRY, this is an ASP.NET CORE solution I also challenged the problem with claims, but the answer was easy to find.

    To refresh your cookie, you can rely on the RefreshSignInAsync() function of the 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;
        }
    

    Inside your function:

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

    NOTE: I'm using an API here, because I'm mixing up a lot with angular. If you update your identity with your API, you need to refresh your page in order to view things based on your claim

    0 讨论(0)
  • 2020-12-08 16:12

    This works for me. Not sure if it is the best way but the updated claim is in the DB and in subsequent controllers.

    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);
    
    0 讨论(0)
  • 2020-12-08 16:30

    I had this same problem, so just wanted to summarise my findings here. As Chris says, the basis of the answer is indeed here: How to change authentication cookies after changing UserName of current user with asp.net identity but I found that thread a bit hard to follow, and that question isn't really a direct duplicate.

    To begin, get the AuthenticationManager from the current OWIN context. Once you have that, you can get the value of "isPersistent" (and other properties from the original SignIn call), by calling the AuthenticateAsync method. Then to update the claims of the current user identity you just need to replace the value of the AuthenticationResponseGrant property like this:

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

    It is the final setting of the AuthenticationResponseGrant property that actually updates the cookie.

    Hope this helps other readers.

    0 讨论(0)
提交回复
热议问题