如何强制更新自定义用户声明?

时间:2016-01-25 23:07:27

标签: asp.net asp.net-mvc asp.net-identity claims-based-identity

我已将自定义声明添加到我的ApplicationUser类中,如下所示:

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        if(Theme != null)
            userIdentity.AddClaim(new Claim("ThemeBundle", Theme.Bundle));

        return userIdentity;
    }

    public int? ThemeId { get; set; }
    [ForeignKey("ThemeId")]
    public virtual Theme Theme { get; set; }
}

我像这样扩展了身份:

public static class IdentityExtensions
{
    public static string GetThemeBundle(this IIdentity identity)
    {
        var claim = ((ClaimsIdentity) identity).FindFirst("ThemeBundle");
        // Test for null to avoid issues during testing
        return (claim != null) ? claim.Value : string.Empty;
    }
}

我通过以下操作方法更新声明背后的模型:

    public ActionResult ChangeTheme(int id)
    {
        var theme = _db.Themes.Find(id);
        if (theme == null)
            return HttpNotFound();

        var userId = User.Identity.GetUserId();
        var user = _db.Users.Find(userId);
        user.Theme = theme;
        _db.SaveChanges();

        return RedirectToAction("Index", "Home");
    }

我在视图(或其他地方)中访问它,如下所示:

User.Identity.GetThemeBundle()

当用户更新他们的&#34;主题&#34;属于&#34; ChangeTheme&#34;行动,在他们注销并重新登录之前没有任何反应。

我花了一整天的时间来考虑以下质量保证,但没有取得好成绩:

Update User Claim not Taking Effect. Why?

MVC 5 AddToRole requires logout before it works?

感谢@Brendan Green:ASP.NET Identity - Forcing a re-login with security stamp

到目前为止,我所获得的最好的是页面将刷新并且声明返回空字符串而不是所需的结果,或者我将用户重定向到登录屏幕。至少那些比没有发生任何事情更不明确。

当用户更改其主题时,我怎样才能获得全球更新声明?#34;属性?如果需要的话,我会找到一个好的方法来完全记录用户并重新开启。使用AuthenticationManager.Signout和.Signin方法并不是很有效。

1 个答案:

答案 0 :(得分:4)

Asp.Net MVC 6 Asp.Identity 3.0.0-rc1-final 开始,您可以使用Task SignInManager<TUser>.RefreshSignInAsync(TUser user);来执行此操作。< / p>