Nano Hash - криптовалюты, майнинг, программирование

Неверный токен. при проверке кода подтверждения электронной почты с помощью UserManager.ConfirmEmailAsync(user.Id, code)

Недавно я перенес удостоверение Asp.net с версии 1.0 на версию 2.0. Я пытаюсь проверить код подтверждения электронной почты, используя метод ниже. Но я получаю сообщение об ошибке «Неверный токен».

public async Task<HttpResponseMessage> ConfirmEmail(string userName, string code)
        {
            ApplicationUser user = UserManager.FindByName(userName);
            var result = await UserManager.ConfirmEmailAsync(user.Id, code);
            return Request.CreateResponse(HttpStatusCode.OK, result);
        }

Создание токена подтверждения электронной почты с использованием кода ниже (и если я вызову ConfirmEmailAsyc сразу после создания токена, который работает нормально). Но когда я звоню, используя другой метод, который дает ошибку

public async Task<HttpResponseMessage> GetEmailConfirmationCode(string userName)
        {
            ApplicationUser user = UserManager.FindByName(userName);
            var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
            //var result = await UserManager.ConfirmEmailAsync(user.Id, code);
            return Request.CreateResponse(HttpStatusCode.OK, code);
        }

Пожалуйста помоги


  • Вы когда-нибудь находили ответ на этот вопрос? Я работал над этим весь день, и, похоже, он вообще работает. 12.08.2014
  • Привет, теперь это работает .. Это из-за моей оплошности. После кодирования URL-адреса и декодирования токенов проверки он работает. Потому что у меня было несколько символов плюс (+) внутри токена 13.08.2014
  • Кумар, не могли бы вы поделиться тем, что вы сделали, чтобы решить эту проблему? 18.08.2014
  • @PitDigger. Простое решение — использовать функцию Replace( ,+); 02.09.2014
  • В моем случае (Asp.Net Core 3.0) кажется, что созданные шаблоны страниц вызвали эту ошибку. См. мой ответ здесь. 27.10.2019

Ответы:


1

Я обнаружил, что вам нужно кодировать токен перед отправкой его по электронной почте, но не при последующей проверке. Итак, мой код для отправки электронной почты гласит:

                // Send an email with this link 
                string code = UserManager.GenerateEmailConfirmationToken(user.Id);

                // added HTML encoding
                string codeHtmlVersion = HttpUtility.UrlEncode(code);

                // for some weird reason the following commented out line (which should return an absolute URL) returns null instead
                // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);

                string callbackUrl = "(your URL)/Account/ConfirmEmail?userId=" +
                    user.Id + "&code=" + codeHtmlVersion;

                // Send an email with this link using class (not shown here)
                var m = new Email();

                m.ToAddresses.Add(user.Email);
                m.Subject = "Confirm email address for new account";

                m.Body =
                    "Hi " + user.UserName + dcr +
                    "You have been sent this email because you created an account on our website.  " +
                    "Please click on <a href =\"" + callbackUrl + "\">this link</a> to confirm your email address is correct. ";

Затем код, подтверждающий электронное письмо, гласит:

// user has clicked on link to confirm email
    [AllowAnonymous]
    public async Task<ActionResult> ConfirmEmail(string userId, string code)
    {

        // email confirmation page            
        // don't HTTP decode

        // try to authenticate
        if (userId == null || code == null)
        {
            // report an error somehow
        }
        else
        {

            // check if token OK
            var result = UserManager.ConfirmEmail(userId, code);
            if (result.Succeeded)
            {
                // report success
            }
            else
            {
                // report failure
            }
        }

Работал в конце концов для меня!

31.05.2016
  • HttpUtility.UrlEncode устранил проблему с моей стороны. Большое спасибо! 09.12.2019

  • 2

    Привет, это произошло, если я получаю URL-адрес (полный) и звоню в API через WebClient. Значение кода должно быть закодировано перед отправкой вызова.

    code = HttpUtility.UrlEncode(code); 
    
    11.08.2016

    3

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

    Asp.NET — Identity 2 — Ошибка недопустимого токена

    Просто используйте:

    emailConfirmationCode = await 
    UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
    UserManager.ConfirmEmailAsync(userId, code1);
    
    06.01.2015

    4

    Была такая же проблема. Исправление заключалось в том, чтобы HTML-кодировал токен при создании ссылки, а при подтверждении - HTML-декодировал его обратно.

        public async Task<IActionResult> ForgotPassword(ForgotPasswordViewModel model)
        {
            if (ModelState.IsValid)
            {
                var user = await _userManager.FindByEmailAsync(model.Email);
                if (user == null )
                {
                    // Don't reveal that the user does not exist or is not confirmed
                    return RedirectToAction(nameof(ForgotPasswordConfirmation));
                }
    
                var code = await _userManager.GeneratePasswordResetTokenAsync( user );
    
                var codeHtmlVersion = HttpUtility.UrlEncode( code );
                var callbackUrl = Url.ResetPasswordCallbackLink(user.Id, codeHtmlVersion, Request.Scheme);
                await _emailSender.SendEmailAsync(
                    model.Email, 
    
                    $"You can reset your password by clicking here: <a href='{callbackUrl}'>link</a>", 
                    _logger );
                return RedirectToAction(nameof(ForgotPasswordConfirmation));
            }
    
            // If we got this far, something failed, redisplay form
            return View(model);
        }
    
        public async Task<IActionResult> ResetPassword(ResetPasswordViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return View(model);
            }
            var user = await _userManager.FindByEmailAsync(model.Email);
            if (user == null)
            {
                // Don't reveal that the user does not exist
                return RedirectToAction(nameof(ResetPasswordConfirmation));
            }
    
            var codeHtmlDecoded = HttpUtility.UrlDecode( model.Code );
    
            var result = await _userManager.ResetPasswordAsync(user, codeHtmlDecoded, model.Password);
            if (result.Succeeded)
            {
                return RedirectToAction(nameof(ResetPasswordConfirmation));
            }
            AddErrors(result);
            return View();
        }
    
    15.05.2018

    5

    Моя проблема была немного другой.

    Я создал свой собственный IUserStore, и одна вещь, которую я делал неправильно, заключалась в том, что я устанавливал для SecurityStamp значение null, если не было никакого значения.

    Штамп безопасности используется для создания маркера, но он заменяется пустой строкой при создании маркера, однако он не заменяется при проверке маркера, поэтому в конечном итоге он сравнивает String.Empty с null, что всегда возвращает false.

    Я исправил свою проблему, заменив нулевые значения для String.Empty при чтении из базы данных.

    13.07.2016
  • Если вы попытаетесь одновременно проверить PhoneNumber и Email, то этот InvalidToken может произойти из-за изменения SecurityStamp при вызове ChangePhoneNumberAsync() для истинного PhoneNumber. Еще немного информации по этой теме, если это ваша проблема: stackoverflow.com/questions/36182915/ 03.06.2021

  • 6

    У нас была такая же проблема, балансировка нагрузки вызывала эту проблему. Добавление <machineKey validationKey="XXX" decryptionKey="XXX" validation="SHA1" decryption="AES"/> в файл web.config решило проблему. Все ваши серверы должны иметь один и тот же машинный ключ для проверки ранее сгенерированного кода.

    Надеюсь это поможет.

    14.11.2017
  • Что добавить в web.config? Ответ неполный. 12.03.2018
  • Привет @MariuszIgnatowicz, тег кода не показывал конфигурацию, и я исправил ее для вас. 12.03.2018
  • Будет ли это работать для ASP.NET Core 2.0? В ASP.NET Core 2.0 нет файла Web.Config. 11.05.2018
  • См. ответ здесь stackoverflow.com/questions/46668192/ 15.05.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..