этот вопрос задавался несколько раз ранее, но ни один из найденных ответов до сих пор не сработал.
Вот такая ситуация:
Я добавляю подтверждение учетной записи электронной почты особенность API. Письмо отправлено и успешно доставлено. Однако метод userManager.ConfirmEmailAsyn c () всегда возвращает false с ошибкой «InvalidToken», даже когда я записываю токены, когда он генерируется, и снова, когда он используется для подтверждения, они совпадают.
I Попытался добавить пользовательский провайдер токена электронной почты, добавить методы HttpUtility.UrlEncode и HttpUtility.UrlDecode при отправке и получении токена. Я переключился с services.AddDefaultIdentity на services.AddIdentity в классе startup.cs (из-за большинства реализаций, которые у меня есть обнаружил, что в сети это делается), я попытался использовать Base64UrlEncoding.
Теперь у меня закончились идеи.
Вот URL-адрес, который активирует метод (токен, закодированный с помощью WebEncoders.Base64UrlEncode) :
1012 *
https://localhost: 5001 / API / ApplicationUser / Confirmemail / Q2ZESjhCOElQTXRMcyt4Tm1wTzhjbXZjTGRITUVkZnN5Z3I0T0ZsQzUwU2xNWG4yQ2E5cjhIalBlWHRVK0h3aVoyT2loc1pUVXpESlo3Q2VKQTk5QXgyMDBPeHh6OHpjdkgxcU5PMHdTbFkrb05OL3Z4OS9Jc2lJdWtIbHNkMGMveXA1YXY0MjRvNzZaaFJCTldJamluWG1ZQlpR . MUY4QUN5dDQrdlVCK2pudXNmSXN4QXhST3dFUmh6VDMrdldGWVBoVmlIS2s3ZWFZallxMTBNamZZdVlNcnZIc0tveVZiYitYQU5LZGRMb2JKTS8xSjNOVWlZN0FLWC92b01FSnNZRmRidz09 / имя surname@gmail.com 1018 * Вот метод, используемый для отправки e-mail:
private async Task<bool> SendConfirmationEmailToken(ApplicationUser user) {
var emailToken = await _userManager.GenerateEmailConfirmationTokenAsync(user);
Console.WriteLine(emailToken);
byte[] tokenGeneratedBytes = Encoding.UTF8.GetBytes(emailToken);
string codeEncoded = WebEncoders.Base64UrlEncode(tokenGeneratedBytes);
emailToken = codeEncoded;
var confirmationLink = Url.Action(nameof(ConfirmEmail), "ApplicationUser", new { token = emailToken, email = user.Email }, HttpContext.Request.Scheme);
var message = new Message(new string[] { user.Email }.ToList(), "[BMC] - Confirm your E-mail adress", "Please confirm your e-mail address by clicking the following <a href=\"" + confirmationLink + "\">link</a>");
_emailSender.SendEmail(message);
return true;
}
Метод, используемый для подтверждения e-mail:
1023 *
Метод ConfigureServices в файле startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddDbContext<BMCContext>(options => options.UseSqlServer(Configuration.GetConnectionString("BMCConnection")));
//JWT Authentication
var key = Encoding.UTF8.GetBytes(Configuration["ApplicationSettings:JwtSecret"].ToString());
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x =>
{
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
};
});
services.AddIdentity<ApplicationUser, IdentityRole>(
options =>
{
options.Password.RequireDigit = false;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;
options.Password.RequiredLength = 5;
options.User.AllowedUserNameCharacters = "aąäábcčćdďđeęéěfghiíjklłmnńňoøóöpqrřsšśtťuúüůvwxyýzžźżAĄÄÁBCČĆDĎĐEÉĚĘFGHIÍJKLŁMNŃŇOØÓÖPQRŘSŠŚTŤUÜŮÚVWXYÝZŽŹŻ0123456789ß-._@+";
options.User.RequireUniqueEmail = true;
options.SignIn.RequireConfirmedEmail = true;
}
)
. AddEntityFrameworkStores<BMCContext>()
.AddDefaultTokenProviders();
var emailConfig = Configuration.GetSection("EmailConfiguration").Get<EmailConfiguration>();
services.AddSingleton(emailConfig);
services.AddScoped<IEmailSender, EmailSender>();
ApplicationSettings applicationSettings = new ApplicationSettings();
Configuration.GetSection("ApplicationSettings").Bind(applicationSettings);
services.AddSingleton<ApplicationSettings>(applicationSettings);
}
Заранее благодарен за помощь