Boa tarde pessoal.
Estou com um erro no código que fiz para o link Esqueci minha senha. Se alguém puder me ajudar. Veja:
[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken]
public async Task EsqueciSenha(EsqueciSenhaViewModel modelo) { if (!ModelState.IsValid) { return View(modelo); }
var provider = IdentityConfig.DataProtectionProvider;
UserManager.UserTokenProvider = new DataProtectorTokenProvider<Usuario>(provider.Create("UserToken"));
var usuario = await UserManager.FindByEmailAsync(modelo.Email);
if (usuario == null || !(await UserManager.IsEmailConfirmedAsync(usuario.Id)))
{
return View("ConfirmacaoEsqueciSenha");
}
var token = await UserManager.GeneratePasswordResetTokenAsync(usuario.Id);
var callbackUrl = Url.Action("ConfirmacaoEsqueciSenha", "Autenticacao", new { UsuarioId = usuario.Id, Token = token }, protocol: Request.Url.Scheme);
var enviarEmail = EmailEsqueciSenhaController.EnviarEmail(usuario, "Por favor redefina sua senha clicando aqui: <a href=\"" + callbackUrl + "\">Redefinir sua senha!</a>", "Alteração de senha");
return View("EmailEsqueciSenhaEnviado");
}
No código acima está tudo ok, recebo o usuario e o token na URL e recebo um e-mail com link para confirmar a alteração, ao clicar neste link sou redirecionada para o código abaixo:
[HttpPost] public async Task ConfirmacaoEsqueciSenha(ConfirmacaoEsqueciSenhaViewModel modelo) { if (ModelState.IsValid) { // Verifica o Token recebido // Verifica o ID do usuário // Mudar a senha var resultadoAlteracao = await UserManager.ResetPasswordAsync( modelo.UsuarioId, modelo.Token, modelo.NovaSenha);`
var provider = IdentityConfig.DataProtectionProvider;
UserManager.UserTokenProvider = new
DataProtectorTokenProvider<Usuario>(provider.Create("UserToken"));
if (resultadoAlteracao.Succeeded)
{
return RedirectToAction("Index", "Home");
}
AddErrors(resultadoAlteracao);
}
return View();
}
Na classe IdentityConfig:
public static IDataProtectionProvider DataProtectionProvider { get; set; }
public void Configuration(IAppBuilder app)
{
DataProtectionProvider = app.GetDataProtectionProvider();
}
E no create do UsuarioManager:
public static UsuarioManager Create()
{
var userStore = new UserStore<Usuario>(new IgsContext());
var manager = new UsuarioManager(new UserStore<Usuario>());
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = false,
RequireDigit = false,
RequireLowercase = false,
RequireUppercase = false,
};
var dataProtectionProvider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("Teste");
if (dataProtectionProvider != null)
{
manager.UserTokenProvider = new DataProtectorTokenProvider<Usuario>(dataProtectionProvider.Create("UserToken"));
}
return new UsuarioManager(userStore);
}
Quando executo o Visual Studio para em um ponto e ocorre a exceção:
"iisexpress.exe" (CLR v4.0.30319: /LM/W3SVC/2/ROOT-1-132030214269111696): Carregado "C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Transactions.resources\v4.0_4.0.0.0_pt-BR_b77a5c561934e089\System.Transactions.resources.dll". O módulo foi criado sem símbolos.
System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Exceção não tratada</Description><AppDomain>/LM/W3SVC/2/ROOT-1-132030214269111696</AppDomain><Exception><ExceptionType>System.NullReferenceException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>Referência de objeto não definida para uma instância de um objeto.</Message><StackTrace>
Ele pára de executar após o envio de e-mails. Sendo que recebo o e-mail da alteração de senha. Se alguém puder me ajudar.
Obrigada. Flávia