Asp.net Ядро подтверждение адреса электронной почты иногда говорит InvalidToken

Вопрос задан: 1 год назад Последняя активность: 1 год назад
up 15 down

Я использую ядро ​​asp.net идентичности 2.1 и я имею случайный вопрос с подтверждением электронной почты, который в то время как подтверждение по электронной почте иногда говорит result.Error = InvalidToken. Маркер также не истек.

Примечание: Мы используем несколько серверов, и мы также хранятся наши ключи в одном месте, так что все серверы используют одинаковые ключи.

Фрагмент кода для подтверждения электронной почты.

подтверждение электронного адреса

var confCode = await _userManager.GenerateEmailConfirmationTokenAsync(user);
        var callbackUrl = Url.Action("ConfirmEmail", "Account", new
        {
            userId = user.Id,
            code = WebUtility.UrlEncode(confCode)
        }, protocol: HttpContext.Request.Scheme);

        string confirmationEmailBody = string.Format(GetTranslatedResourceString("ConfirmationEmailBody"), "<a href='" + callbackUrl + "'>") + "</a>";

Проверка маркера

public async Task<bool> ConfirmEmailAsync(string userId, string code)
    {
        if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(code))
            return false;


        var user = await _userManager.FindByIdAsync(userId);

        if (user == null)
            return false;

        var result = await _userManager.ConfirmEmailAsync(user, code).ConfigureAwait(false);

        if (!result.Succeeded)
            result = await _userManager.ConfirmEmailAsync(user, WebUtility.UrlDecode(code)).ConfigureAwait(false);

        return result.Succeeded;
    }

Недопустимый маркер

Ниже маркер кодируется в два раза, но мы обрабатываем эту ситуацию

CfDJ8HYrrpCgcr5GvrItPOWapXRy8WF8odd%252BVKuDup7buRsl1x4agRpfgQlEIPWiBqM0Wuilu9tCv5l%252B3lNaAb89%252Fi%252B4k0y%252FH0jdXAbabz0%252FXDGA0eUrmcKdIsDFNuXeyP5ezTVmTx8t0ky9xCTXaKLAfvTsCJviETk5Ag9JbUs3l3%252BnUon6fyYOHsslJI5VKLqhMM0Sm%252BW1EE%252B%252FPEJ%252BXcn%252FPS1My%252BI1lExuF1R1hFEZScEsUCG%252Bx%252BVIFB9bzs1IoLC%252Baw%253D%253D

Любая помощь будет оценена, спасибо!

7 ответов

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Реклама

up 1 down

Эта проблема, как представляется, основная строка запроса, относящаяся проблема. Там нет указателей на ваш вопрос о выборке ожидается значения и примера фактического значения. Поэтому я не буду в состоянии предоставить Вам точный ответ здесь. Но ниже два являются указатели, которые, безусловно, решить эту проблему.

Там может быть два вопроса:

Выпуск 1: Оригинал Base-64 не восстанавливается после HtmlDecode/UrlDecode

Эти маркеры кодируются в качестве базовых 64 строк, которые могут содержать символы, такие как «+».

Они отправляются на сервер.

Затем сервер пытается выполнить операцию HtmlDecode на этой строке, чтобы удалить символы, которые были на самом деле присутствуют в исходной базе 64 токенов.

Например. «+» Заменяется на пустую строку.

Таким образом, маркер генерируется после WebUtility.HtmlDecode недействителен. Вот почему вы получите неверный маркер ошибки

How to check this ? Вы можете отлаживать и посмотреть, что это значение после того, как HtmlDecode и что, как ожидается, стоимость. Если они отличаясь тем эта первопричина.

Проблема 2: Строка запроса не правильно сформирована

Несколько ключевых пары значений в строках запроса соединяются с помощью «&» характера. например ключ1 = значение1 & ключ2 = значение2

Но несколько раз вместо & , Его кодированный вариант &amp; приходит в строке запроса.
например ключ1 = значение1 & ключ2 = значение2

Сервер .Net не сможет правильно разобрать строку запроса, если это так.

How to check this ? Вы можете использовать непосредственно чтения необработанных строк запроса из HttpContext или HttpRequest с помощью QueryString свойства и проверить, если это так. Если после этого вы можете либо изменить клиент для отправки соответствующей строки запроса (более логичной и ремонтопригодна) или написать код, чтобы исправить его на стороне сервера.

Эти указатели должны помочь вам решить эту проблему.

up 0 down

Я думаю, что процесс создания пользовательского занимает слишком много времени Перед тем, как щелкают подтвердить Убедитесь, что вы проверить базу данных пользователя создается Проверьте электронную почту подтверждения ложно в таблице SQL

up 0 down

Вам не нужно, чтобы решить эту проблему с помощью сервера идентичности.

Если регистр пользователя добавить два столбца в таблице пользователя. Один для проверки и других для IsVerified. В столбце проверки маркера добавить Guid. Затем сформировать связь с этим Guid. Когда пользователь нажимает на эту ссылку, то вы получите Guid внутри контроллера. Затем получить этот пользователь, используя эту колонку, затем установите столбец IsVerified истину и удалить столбец Guid. И ваш пользователь успешно проверен.

up 0 down

ваш запрос по электронной почте конформации воли дает вам ответ, как идентификатор пользователя и ваш секретный ключ, но ваш маркер метод должен быть другая функция, как маркера обновления, вам необходимо добавить некоторые условия, например, если маркер истекло, то обновите маркер

up 0 down

Вы должны расшифровать код подтверждения перед передачей его в _userManager.ConfirmEmailAsync(user, code).ConfigureAwait(false) метод.

Вы URL закодирован код подтверждения, который вы используете в CallBackURL; Вы должны использовать WebUtility.UrlDecode(code) декодировать его, прежде чем пытаться использовать его.

up 0 down

Это не может быть идеальным ответом, но если вам просто нужно срочное исправление и меньше головной боли, просто генерировать короткий бедствия свободный маркер/код.

    services.AddIdentity<ApplicationUser, ApplicationRole>(options => {
        options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider;
        options.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider;
    }).AddDefaultTokenProviders()
    .AddEntityFrameworkStores<YourDbContext>();
up 0 down

Если закодированный код содержит «==», в конце концов. то есть после того, как UrlEncode или base64 кодирования, если код выходит, как это «cm9vdA ==».

декодирования это не даст вам точную закодированную строку и приведет недействительный код.

Таким образом, при создании маркеров проверки, если закодированное значение заканчивается «==». Если он генерирует другой маркер, и проблема будет решена.

Ошибка 505

Что-то пошло не так

Попробуйте воспользоваться поиском