API do tnet core 3.1 - UserManager.ConfirmEmailAsyn c возвращает InvalidToken - PullRequest
1 голос
/ 26 апреля 2020

этот вопрос задавался несколько раз ранее, но ни один из найденных ответов до сих пор не сработал.

Вот такая ситуация:

Я добавляю подтверждение учетной записи электронной почты особенность 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);


    }

Заранее благодарен за помощь

1 Ответ

0 голосов
/ 28 апреля 2020

После тщательного тестирования мне удалось найти ошибку,

ошибка отправляла неверные данные в метод CreateAsyn c, из-за чего UserManager дважды пытался создать пользователя, что, в свою очередь, приводило к токен подтверждения недействителен, так как он был сгенерирован для совершенно другого пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...