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

Foi útil?

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()))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top