2014-12-08 2 views
5

Sto cercando di capire perché i miei utenti ottengono frequenti token non validi quando confermano la loro e-mail. Non riesco a riprodurre il problema.Perché ricevo token non validi sporadici per la verifica della posta elettronica nell'identità ASP.NET?

Ecco il programma di installazione:

userManager.UserTokenProvider = new EmailTokenProvider<User>(); 

Ecco come viene generato il token:

var code = await userManager.GenerateEmailConfirmationTokenAsync(user.Id); 

Ecco come è verificato:

var result = await userManager.ConfirmEmailAsync(user.Id, code); 

Capisco che il EmailTokenProvider utilizza timbro di sicurezza per invalidazione. La mia comprensione è che questo timbro cambia solo quando modifiche significative all'entità Utente sono fatte come cambiare la password o il nome utente. Tuttavia ricevo invalidi invalidi molto più spesso perché questa sia l'unica spiegazione.

Sto cercando qualsiasi puntatore che possa aiutarmi a far luce sul perché questo si sta verificando.

Edit:

Ho scavato intorno al codice sorgente (la documentazione è molto scarsa) e come @trailmax rilevare sotto EmailTokenProvider è sbagliato per questo caso d'uso. Si basa su TotpSecurityStampBasedTokenProvider che ha timeout codificato su token a 3 minuti!

+1

* Si basa su TotpSecurityStampBasedTokenProvider che ha timeout hardcoded su token a 3 minuti! * Questo è fuorviante, il timestep è 3 minuti ma 'ValidateCode' contiene' for (int index = -2; index <= 2; ++ indice) 'che consente un token per più di 3 minuti. Ma non di molto :) –

risposta

8

EmailTokenProvider genera token molto breve e ha un aspetto di 6 cifre. Questo token ha lo scopo di essere un 2FA e valido solo per un breve periodo di tempo (qualcosa come 10-15 minuti, non si conosce il valore effettivo).

Il meglio che puoi fare è usare l'identità fornita DataProtectorTokenProvider e questo è un po 'complicato, perché non è semplice strapparlo dalle mani di OWIN.

Il modo in cui vado in giro è assegnare variabile statica nella mia Start.Auth.cs e poi riutilizzarlo in UserManager:

public class AuthConfig 
{ 
    public static IDataProtectionProvider DataProtectionProvider { get; set; } 

    public void Configuration(IAppBuilder app) 
    { 
     ConfigureAuth(app); 
    } 

    public void ConfigureAuth(IAppBuilder app) 
    { 
     DataProtectionProvider = app.GetDataProtectionProvider(); 

     // do other configuration 
    } 
} 

E poi ri-assegnarlo nel costruttore di UserManager:

 var dataProtectorProvider = AuthConfig.DataProtectionProvider; 
     var dataProtector = dataProtectorProvider.Create("My Asp.Net Identity"); 
     this.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser, Guid>(dataProtector) 
     { 
      TokenLifespan = TimeSpan.FromHours(24), 
     }; 

In questo modo ricevi token email molto lunghi che durano per 24 ore.

Ho fatto lo stesso errore che hai fatto, ma ho dovuto correggere presto quando gli utenti si sono lamentati.