Сгенерированный код имеет кодировку Base64, и некоторые символы в Base64 не разрешены в сегменте пути URL-адреса по умолчанию из соображений безопасности, даже если кодируется URL-адрес. Хотя это можно изменить, вы не должны этого делать, поскольку проблемы безопасности действительны, и вы не хотите подвергать свое приложение эксплойтам.
Вместо этого вы можете просто позволить коду быть частью строки запроса. Та же самая уязвимость не существует для части строки запроса URL, и символы будут разрешены там. Кроме того, вы можете использовать другой тип кода. Поставщики токенов, используемые Identity для таких вещей, как подтверждение по электронной почте и сброс пароля, могут быть настроены.
Идентификация включает в себя других поставщиков токенов для целей двухфакторной аутентификации, с которой вы можете переключиться, если хотите. В них используются токены на основе TOTP (6-7-значные числа, которые вы постоянно видите с 2FA). Или вы можете создать свой собственный провайдер и обрабатывать его так, как вам нравится. Чтобы сменить провайдера, вы просто настраиваете участника Tokens
при настройке удостоверения:
services.AddIdentity<ApplicationUser, IdentityRole>(o =>
{
// other options here like password reqs, etc.
o.Tokens.ChangeEmailTokenProvider = TokenOptions.DefaultEmailProvider;
o.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider;
o.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider;
}
Приведенное выше описание приведет к тому, что эти три сценария будут генерировать токены с помощью EmailTokenProvider
, который является одним из встроенных поставщиков TOTP.
Если вы хотите использовать собственного провайдера, вы просто создаете класс, который реализует IUserTwoFactorTokenProvider<TUser>
, и регистрируете это:
services.AddIdentity<ApplicationUser, IdentityRole>(o =>
{
...
})
.AddTokenProvider<MyCustomTokenProvider<ApplicationUser>>("MyTokenProviderName");
Строка, которую вы используете как «имя», - это то, что вы использовали бы, чтобы назначить ее в качестве провайдера токена в предыдущем коде выше, т.е.
o.Tokens.PasswordResetTokenProvider = "MyTokenProviderName";