Повторное использование утверждения в regenerateIdentityCallback в Owin Identity в MVC5

StackOverflow https://stackoverflow.com//questions/25042822

Вопрос

Я использую MVC5 с идентификатором Owin.

Я изо всех сил пытаюсь повторно использовать любые пользовательские утверждения в 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;
    }

Проблема в том, что я не могу повторно использовать утверждение, и мне всегда приходится получать для него новое значение.После исследования Identity dll я вижу, что this экземпляр пользователя не имеет претензий, поскольку это новый пользователь из базы данных и userIdentity имеет только стандартные утверждения в качестве идентификатора и имени пользователя, которые создаются методом CreateIdentityAsync.Получить пользователя из HttpContext.Current невозможно, в этом месте он имеет значение null.

Как лучше всего повторно использовать утверждение, чтобы сохранить некоторые значения из файла cookie?Вероятно, я неправильно понял цель претензий.Заранее спасибо за вашу помощь

Это было полезно?

Решение

Вы можете получить тот же результат, делая это (Context.identity - предыдущая идентичность):

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 который делает то же самое, что и исходный, но передает текущий идентификатор претензий в 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()))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top