Повторное использование утверждения в regenerateIdentityCallback в Owin Identity в MVC5
-
21-12-2019 - |
Вопрос
Я использую 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()))