Reutilizar declaração em regenerateIdentityCallback em Owin Identity em MVC5
-
21-12-2019 - |
Pergunta
Estou usando MVC5 com identidade Owin.
Estou lutando para reutilizar quaisquer declarações personalizadas em regenerateIdentityCallback.
Tenho no Startup esta configuração (conforme previsto no Template padrão para novo projeto 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()))
}
});
o GenerateUserIdentityAsync se parece com isto:(também praticamente padrão do modelo)
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;
}
O problema é que não consigo reutilizar a reivindicação e sempre tenho que obter um novo valor por ela.Após investigação da dll de identidade, vejo que this
a instância do usuário não tem declarações, pois é um usuário novo do banco de dados e userIdentity
possui apenas as declarações padrão como Id e UserName, que são criadas pelo método CreateIdentityAsync.Não é possível obter o usuário de HttpContext.Current, é nulo neste local.
Qual a melhor forma de reutilizar uma Claim para manter alguns valores do Cookie?Provavelmente entendi mal o propósito das Reivindicações.Obrigado antecipadamente pela sua ajuda
Solução
Você pode obter o mesmo resultado fazendo isto (context.Identity é a identidade anterior):
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)
Outras dicas
Desisti e criei o meu próprio SecurityStampValidator
que faz exatamente o mesmo que o original, mas passa o ClaimIdentity atual para regenerateIdentityCallback como parâmetro.Não estou nada satisfeito com esta solução, mas funciona.
OnValidateIdentity = MySecurityStampValidator.OnValidateIdentity<ApplicationUserManager, DtbsUser, Guid>(
validateInterval: TimeSpan.FromSeconds(10),
regenerateIdentityCallback: (manager, user, previousIdentity) => user.GenerateUserIdentityAsync(manager, previousIdentity),
getUserIdCallback: user => Guid.Parse(user.GetUserId()))