2014-05-22 11 views
8

Desidero convalidare manualmente un token di reimpostazione della password in ASP.NET Identity 2.0. Sto cercando di creare la mia versione di UserManager.ResetPasswordAsync(string userId, string token, string newPassword) che prende e IdentityUser invece di userId come questo:Convalida manuale di un token di reimpostazione della password nell'identità ASP.NET

UserManager.ResetPasswordAsync(IdentityUser user, string token, string newPassword) 

Non sono sicuro se sto facendo questo diritto, ma qui sto cercando di convalidare il codice che è stato inviato via email l'utente in un passaggio precedente. Non ho modificato il codice/token che invia l'email all'utente e genera il codice. Sto assumendo che questo sia il metodo corretto per chiamare, ma l'argomento purpose non è corretto. (Ho provato passando "ASP.NET identità", ma niente da fare.)

if (await userManager.UserTokenProvider.ValidateAsync(purpose: "?", token: code, manager: userManager, user: user)) 
{ 
    return IdentityResult.Success; 
} 
else 
{ 
    return new IdentityResult("Invalid code."); 
} 

Se qualcuno mi potrebbe riempire sui dettagli di come funziona fuori dalla scatola, o indicarlo al codice sorgente di Microsoft per UserManager.ResetPasswordAsync(IdentityUser user, string token, string newPassword) che sarebbe più apprezzato!

risposta

3

Sembra che il codice per Microsoft.AspNet.Identity non è stato open source in base al repository Codeplex situato a:

https://aspnetidentity.codeplex.com/SourceControl/latest#Readme.markdown

Allo stato attuale, il codice del framework ASP.NET identità è non pubblico e pertanto non saranno pubblicati su questo sito. Tuttavia, stiamo pianificando lo per cambiarlo e, non appena possibile, il codice verrà pubblicato in questo repository.

Tuttavia ho trovato questo che potrebbe essere la fonte per l'UserManager sulla base dei simboli di debug:

UserManager Source Code

Ho anche trovato questi posti che potrebbe aiutare:

Implementing custom password policy using ASP.NET Identity

UserManager Class Documentation

IUserTokenProvider Interface Documentation

+0

I simboli di debug mi hanno ottenuto quello di cui avevo bisogno. Molte grazie! EDIT: Si è scoperto che "ResetPassword" è lo scopo corretto per questo scenario. –

8

Ho risolto il problema impostando lo scopo su "ResetPassword".

Di seguito è riportato uno snippet del risultato finale nel caso in cui qualcuno volesse fare qualcosa di simile. È un metodo nella mia classe ApplicationUserManager. Si rende conto, tuttavia, che alcune delle eccezioni relative alla gestione delle implementazioni Microsoft sono mancanti o non localizzate perché determinate variabili private, metodi e risorse utilizzate nel loro codice non sono accessibili. È sfortunato che non abbiano protetto quella roba in modo che io possa averlo ottenuto. La chiamata di metodo mancante ThrowIfDisposed è interessante (e bazar) per me. Apparentemente anticipano le chiamate di metodo dopo che un'istanza è stata eliminata per fornire un messaggio di errore più amichevole ed evitare l'imprevisto.

public async Task<IdentityResult> ResetPasswordAsync(IdentityUser user, 
    string token, string newPassword) 
{ 
    if (user == null) 
    { 
     throw new ArgumentNullException("user"); 
    } 

    // Make sure the token is valid and the stamp matches. 
    if (!await UserTokenProvider.ValidateAsync("ResetPassword", token, 
     this, user)) 
    { 
     return IdentityResult.Failed("Invalid token."); 
    } 

    // Make sure the new password is valid. 
    var result = await PasswordValidator.ValidateAsync(newPassword) 
     .ConfigureAwait(false); 
    if (!result.Succeeded) 
    { 
     return result; 
    } 

    // Update the password hash and invalidate the current security stamp. 
    user.PasswordHash = PasswordHasher.HashPassword(newPassword); 
    user.SecurityStamp = Guid.NewGuid().ToString(); 

    // Save the user and return the outcome. 
    return await UpdateAsync(user).ConfigureAwait(false); 
} 
+0

IMHO dovrebbe chiamare 'SetSecurityStampAsync' e' SetPasswordHashAsync' invece di un pieno 'UpdateAsync' ... Non è la prima cosa stupida che fanno in questo pasticcio di identità di ASP.NET ... – Vincent

Problemi correlati