|
|
|
@@ -1,6 +1,7 @@ |
|
|
|
using Microsoft.AspNetCore.WebUtilities; |
|
|
|
using Microsoft.Extensions.Logging; |
|
|
|
using System.Net; |
|
|
|
using System.Web; |
|
|
|
|
|
|
|
namespace Diligent.WebAPI.Business.Services |
|
|
|
{ |
|
|
|
@@ -356,7 +357,7 @@ namespace Diligent.WebAPI.Business.Services |
|
|
|
await _databaseContext.SaveChangesAsync(); |
|
|
|
} |
|
|
|
|
|
|
|
public async Task<ServiceResponseDTO<object>> GetEmailConfirmationUrlAsync(string email) |
|
|
|
public async Task<ServiceResponseDTO<object>> GetForgotPasswordUrlAsync(string email) |
|
|
|
{ |
|
|
|
var user = await _userManager.FindByEmailAsync(email); |
|
|
|
if (user == null) |
|
|
|
@@ -368,12 +369,11 @@ namespace Diligent.WebAPI.Business.Services |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
var token = await _userManager.GenerateEmailConfirmationTokenAsync(user); |
|
|
|
var token = await _userManager.GeneratePasswordResetTokenAsync(user); |
|
|
|
token = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(token)); |
|
|
|
|
|
|
|
await _emailer.SendEmailAndWriteToDbAsync(email, "Reset password", HTMLHelper.RenderForgotPasswordPage($"{_frontEndSettings.BaseUrl}/reset-password?token={token}&email={email}"), isHtml: true); |
|
|
|
|
|
|
|
user.PasswordResetToken = token; |
|
|
|
await _databaseContext.SaveChangesAsync(); |
|
|
|
return new ServiceResponseDTO<object> |
|
|
|
{ |
|
|
|
Data = new { code = token, email = email } |
|
|
|
@@ -391,27 +391,19 @@ namespace Diligent.WebAPI.Business.Services |
|
|
|
ErrorMessage = "Email did not find." |
|
|
|
}; |
|
|
|
} |
|
|
|
// FOR SOME REASON USERMANAGER.RESETPASSWORDASYNC returns InvalidToken. In future change this |
|
|
|
//var passwordResetToken = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code)); |
|
|
|
|
|
|
|
//IdentityResult resetResult = await _userManager.ResetPasswordAsync(user, passwordResetToken, password); |
|
|
|
//if (resetResult.Succeeded) |
|
|
|
await _userManager.RemovePasswordAsync(user); |
|
|
|
await _userManager.AddPasswordAsync(user, password); |
|
|
|
if (user.PasswordResetToken == code) |
|
|
|
var passwordResetToken = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code)); |
|
|
|
|
|
|
|
IdentityResult resetResult = await _userManager.ResetPasswordAsync(user, passwordResetToken, password); |
|
|
|
if (resetResult.Succeeded) |
|
|
|
{ |
|
|
|
if (await _userManager.IsLockedOutAsync(user)) |
|
|
|
{ |
|
|
|
await _userManager.SetLockoutEndDateAsync(user, DateTimeOffset.UtcNow); |
|
|
|
} |
|
|
|
return new ServiceResponseDTO<object> { Data = true }; |
|
|
|
} |
|
|
|
|
|
|
|
//var errors = resetResult.Errors.Select(x => x.Description); |
|
|
|
var errors = resetResult.Errors.Select(x => x.Description); |
|
|
|
return new ServiceResponseDTO<object> |
|
|
|
{ |
|
|
|
IsError = true, |
|
|
|
ErrorMessage = "Invalid reset password token" |
|
|
|
ErrorMessage = errors.First() |
|
|
|
}; |
|
|
|
} |
|
|
|
} |