Опитвам се да внедря система за покани, при която новосъздадените акаунти получават токен за потвърждение по имейл чрез UserManager.GenerateEmailConfirmationToken и UserManager.ConfirmEmail. Методът ConfirmEmail обаче винаги връща false.
Съгласно предложението в тази публикация, която внедрих моя MachineKeyDataProtector и регистриран в Unity по този начин:
container.RegisterType<IUserTokenProvider<User, Guid>,
DataProtectorTokenProvider<User, Guid>>(new InjectionConstructor(new MachineKeyDataProtector("ASP.NET Identity")));
My UserManager се инжектира с IUserTokenProvider по следния начин:
public UserManager(IUserStore<User, Guid> store, IUserTokenProvider<User, Guid> userTokenProvider)
: base(store)
{
// Configure validation logic for passwords
this.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = false,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
this.UserTokenProvider = userTokenProvider;
}
След това капсулирах метода GenerateEmailConfirmationToken в метод на разширение:
public static string GenerateUrlForEmailConfirmationToken(this UserManager<User, Guid> userManager, UrlHelper urlHelper, Guid userId)
{
var verificationCode = userManager.GenerateEmailConfirmationToken(userId);
var url = urlHelper.Link(string.Empty, new
{
controller = "Account",
action = "Verify",
userId = userId,
verificationCode = verificationCode
});
return url;
}
И аз го използвам:
var url = UserManager.GenerateUrlForEmailConfirmationToken(Url, targetUser.Id);
//injects the url in a ready made html template
NotificationService.NotifyNewUser(targetUser, url);
Отстраняване на грешки GenerateUrlForEmailConfirmationToken Видях, че методът за защита на MachineKeyDataProtector се извиква, но премахването на защитата на MachineKeyDataProtector никога не се извиква от ConfirmEmail на UserManager.
Ако променя конфигурацията на DI, за да регистрирам IUserTokenProvider на заявка
container.RegisterType<IUserTokenProvider<User, Guid>,
DataProtectorTokenProvider<User, Guid>>(new PerRequestLifetimeManager(),
new InjectionConstructor(new MachineKeyDataProtector("ASP.NET Identity")));
Тогава премахването на защитата на MachineKeyDataProtector се извиква, но генерира CryptographicException със следното съобщение „Възникна грешка по време на криптографска операция.“.
Възможно ли е това да е причината валидирането винаги да е невярно? Ако е така, как да гарантирам, че методът за премахване на защитата е извикан? Като разглежда обектите и в двете ситуации, UserManager изглежда използва правилния IDataProtector.
Всяка помощ се оценява!