O que é a interface IUserSecurityStampStore <TUser> do ASP.NET Identity?

178

Observando a identidade do ASP.NET (nova implementação de associação no ASP.NET), deparei-me com essa interface ao implementar minha própria UserStore:

//Microsoft.AspNet.Identity.Core.dll

namespace Microsoft.AspNet.Identity
{ 
    public interface IUserSecurityStampStore<TUser> :
    {
        // Methods
        Task<string> GetSecurityStampAsync(TUser user);
        Task SetSecurityStampAsync(TUser user, string stamp);
    }
}

IUserSecurityStampStoreé implementado pelo padrão EntityFramework.UserStore<TUser>que essencialmente obtém e define a TUser.SecurityStamppropriedade

Depois de mais algumas pesquisas, parece que a SecurityStampé Guidgerado recentemente em pontos-chave do UserManager(por exemplo, alteração de senhas).

Não consigo decifrar muito além disso, pois estou examinando esse código no Reflector . Quase todas as informações de símbolos e assinaturas foram otimizadas.

Além disso, o Google não tem sido de muita ajuda.

As perguntas são:

  • O que é uma SecurityStampidentidade no ASP.NET e para que é usada?
  • O SecurityStamppapel desempenha algum papel quando os cookies de autenticação são criados?
  • Existem ramificações ou precauções de segurança que precisam ser tomadas com isso? Por exemplo, não envie esse valor a jusante para os clientes?

Atualização (16/9/2014)

Código fonte disponível aqui:

Brian Chavez
fonte
1
@TryingToImprove, o novo repositório de Identidades e o middleware OWIN dependente foram projetados para serem altamente personalizáveis. Como o SimpleMembership, existe uma implementação pronta para usar, aproveitando o mais recente EF no SQL Express. Mas o esquema, o método de consulta de dados, a origem do banco de dados e até o middle ware são personalizáveis ​​em torno da sua puprose específica. Além do mais, a implementação lançada pela MS ainda está evoluindo. É por isso que todos lutam para encontrar uma definição específica.
Dave Alperovich

Respostas:

224

Isso significa representar o instantâneo atual das credenciais do usuário. Portanto, se nada mudar, o carimbo permanecerá o mesmo. Mas se a senha do usuário for alterada ou um login for removido (desvincular sua conta do google / fb), o carimbo será alterado. Isso é necessário para coisas como assinar automaticamente usuários / rejeitar cookies antigos quando isso ocorre, que é um recurso que vem na versão 2.0.

A identidade ainda não é de código aberto, ainda está em andamento.

Edit: Atualizado para 2.0.0. Portanto, o objetivo principal do SecurityStampé ativar o logout em qualquer lugar. A idéia básica é que sempre que algo relacionado à segurança for alterado no usuário, como uma senha, é uma boa idéia invalidar automaticamente qualquer cookie de login existente; portanto, se sua senha / conta foi comprometida anteriormente, o invasor não terá mais acesso.

Na 2.0.0, adicionamos a seguinte configuração para conectar o OnValidateIdentitymétodo CookieMiddlewareao examinar SecurityStampe rejeitar cookies quando ele foi alterado. Ele também atualiza automaticamente as reivindicações do usuário do banco de dados sempre refreshIntervalque o carimbo for inalterado (que cuida de coisas como mudar de função etc.)

app.UseCookieAuthentication(new CookieAuthenticationOptions {
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider {
        // Enables the application to validate the security stamp when the user logs in.
        // This is a security feature which is used when you change a password or add an external login to your account.  
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            validateInterval: TimeSpan.FromMinutes(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
    }
});

Se seu aplicativo deseja acionar esse comportamento explicitamente, ele pode chamar:

UserManager.UpdateSecurityStampAsync(userId);
Hao Kung
fonte
1
E se eu estiver migrando dados da estrutura da tabela MVC4? Posso apenas deixar esse campo em branco? Ou vai estragar as coisas de alguma forma?
Dmytro Shevchenko
1
Você pode apenas devolver o ID ou algo constante para efetivamente torná-lo um não operacional. Nulo / "" provavelmente funcionaria também.
Hao Kung
2
O UserManager.UpdateSecurityStampAsync (userId) funciona para UseOAuthBearerTokens?
Rikard
7
Não, o OAuthBearerTokens não é afetado atualmente.
Hao Kung
3
O UseCookieAuthenticationestá obsoleto até agora. Eu consegui configurá-lo usando services.Configure<SecurityStampValidatorOptions>(o => o.ValidationInterval = TimeSpan.FromSeconds(10));.
riezebosch 6/09/17
11

A UseCookieAuthentication está obsoleta agora. Eu consegui configurá-lo usando

services.Configure<SecurityStampValidatorOptions>(o => 
    o.ValidationInterval = TimeSpan.FromSeconds(10));

Movido da resposta para responder por solicitação .

riezebosch
fonte
3
Isso funciona se eu estiver usando o ASP.NET (não o Core)? Estou confuso. Se eu for para o Asp Identity Repo, ele diz que é para o Asp.NET Core.
El Mac
5

Observei que o SecurityStamp era necessário para a verificação do token.

Para repo: Definir SecurityStamp como nulo no banco de dados Gerar um token (funciona ok) Verificar token (falhar)

KierenH
fonte
Isso tem que ser um bug. Não faz sentido gerar um token que não possa ser verificado.
William T. Mallard
O problema é que ele permite gerar um token quando o carimbo de segurança está em branco. (imho GenerateEmailConfirmationToken deve falhar se não houver segurança selo Veja esta resposta:. stackoverflow.com/a/29926407/1058214 )
Mendel