MVC5中Owin Identity中regenerateIdentityCallback中的重用声明



我使用的是带有Owin身份的MVC5。

我正在努力重用regenerateIdentityCallback中的任何自定义声明。

我在启动这个配置(在新的MVC项目的标准模板中提供)

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            Provider = new CookieAuthenticationProvider
            {
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser, Guid>(
                    validateInterval: TimeSpan.FromSeconds(10),
                    regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
                    getUserIdCallback: (user) => Guid.Parse(user.GetUserId()))
            }
        });

GenerateUserIdentityAsync看起来是这样的(也很符合模板的标准)

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, Guid> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // I want here instead of generating new one, just reuse the previous one
        userIdentity.AddClaim(new Claim(ClaimTypes.Sid, Guid.NewGuid().ToString()));
        return userIdentity;
    }

问题是,我不能重用Claim,我总是必须为它获取新的值。在对身份dll进行调查后,我看到,用户的this实例没有声明,因为它是来自数据库的新用户,userIdentity只有标准声明作为Id和UserName,这是由CreateIdentityAsync方法创建的。从HttpContext中获取用户。当前是不可能的,在这个地方是空的。

重用声明以从Cookie中保留一些值的最佳方法是什么?我可能误解了索赔的目的。提前感谢您的帮助

您可以通过以下操作获得相同的结果(context。标识是之前的标识):

OnValidateIdentity = context => SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, DtbsUser, Guid>(
                            validateInterval: TimeSpan.FromSeconds(30),
                            regenerateIdentityCallback:
                                (manager, user) =>
                                    user.GenerateUserIdentityAsync(manager, context.Identity),
                            getUserIdCallback: (ci) => Guid.Parse(ci.GetUserId())).Invoke(context)

我放弃并创建了自己的SecurityStampValidator,它与原始的完全相同,但将当前的claimsIdentity传递给regenerateIdentityCallback作为参数。我对这个解决方案一点也不满意,但它有效。

       OnValidateIdentity = MySecurityStampValidator.OnValidateIdentity<ApplicationUserManager, DtbsUser, Guid>(
                    validateInterval: TimeSpan.FromSeconds(10),
                    regenerateIdentityCallback: (manager, user, previousIdentity) => user.GenerateUserIdentityAsync(manager, previousIdentity),  
                    getUserIdCallback: user => Guid.Parse(user.GetUserId()))

相关内容

  • 没有找到相关文章

最新更新