Повторное использование заявки в регенерацииIdentityCallback в идентификаторе Owin в MVC5

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

Я пытаюсь повторно использовать любые пользовательские претензии в регенерацииIdentityCallback.

У меня есть в Startup эту конфигурацию (как указано в стандартном шаблоне для нового проекта 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;
    }

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

Каков наилучший способ повторного использования Претензии для сохранения некоторых значений из Cookie? Я, вероятно, неправильно понял цель претензий. спасибо заранее за вашу помощь

Ответ 1

Вы можете получить тот же результат, выполнив это (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)

Ответ 2

Я сдался и создал собственный SecurityStampValidator, который делает то же самое, что и оригинал, но передает текущие требованияIdentity для регенерацииIdentityCallback в качестве параметра. Совсем не рад этому решению, но он работает.

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