IUserTokenProvider не зарегистрирован

Недавно я обновил Asp.Net Identity Core формы заявки 1.0 до версии 2.0.

Есть новые функции, которые я хотел попробовать, такие как GenerateEmailConfirmationToken и т. д.

Я использую это проект в качестве эталона.

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

private readonly UserManager<ApplicationUser> _userManager;     

public ActionResult Register(RegisterViewModel model)
{
    if (ModelState.IsValid)
    {
        var ifUserEXists = _userManager.FindByName(model.EmailId);
        if (ifUserEXists == null) return View(model);
        var confirmationToken = _userRepository.CreateConfirmationToken();//this is how i'm generating token currently.                
        var result = _userRepository.CreateUser(model,confirmationToken);
        var user = _userManager.FindByName(model.EmailId);
        if (result)
        {
            var code = _userManager.GenerateEmailConfirmationToken(user.Id);//error here
            _userRepository.SendEmailConfirmation(model.EmailId, model.FirstName, confirmationToken);
            //Information("An email is sent to your email address. Please follow the link to activate your account.");
            return View("~/Views/Account/Thank_You_For_Registering.cshtml");
        }     
    }
    
    //Error("Sorry! email address already exists. Please try again with different email id.");
    ModelState.AddModelError(string.Empty, Resource.AccountController_Register_Sorry__User_already_exists__please_try_again_);
    return View(model);
}

В соответствии

 var code = _userManager.GenerateEmailConfirmationToken(user.Id);

Я получаю сообщение об ошибке:

No IUserTokenProvider is registered.

Пока я просто хотел посмотреть, какой код он генерирует. Есть ли какие-то изменения, которые мне нужно внести в мой класс ApplicationUser, который наследуется от класса IdentityUser?

Или мне нужно что-то изменить, чтобы эти функции работали?


person Cybercop    schedule 25.03.2014    source источник
comment
Есть ли способ проверить, существует ли пользователь, основываясь на других полях, кроме адреса электронной почты? Например, если бы у меня было два поля с именами CustomerNumber и Postcode для пользователей, которые уже существовали бы в базе данных, чтобы никто не мог зарегистрироваться   -  person Jay    schedule 01.02.2015


Ответы (10)


Вы должны указать UserTokenProvider для создания токена.

using Microsoft.Owin.Security.DataProtection;
using Microsoft.AspNet.Identity.Owin;
// ...

var provider = new DpapiDataProtectionProvider("SampleAppName");

var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>());

userManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(
    provider.Create("SampleTokenName"));

Вам также следует прочитать эту статью: Добавление двухфакторной аутентификации в приложение с использованием удостоверения ASP.NET.

person meziantou    schedule 25.03.2014
comment
что такое "Sample" и "EmailConfirmation"? текст, который может быть чем угодно? - person Cybercop; 25.03.2014
comment
Sample=AppName, EmailConfirmation=цель (например, имена параметров) - person meziantou; 25.03.2014
comment
Да, но вам придется использовать то же самое для создания и проверки токенов. - person meziantou; 25.03.2014
comment
Ссылка в порядке. Вы помещаете этот код там, где вы инициализируете UserManager - person meziantou; 19.04.2014
comment
это приводит к тому, что «Не удалось загрузить тип System.Security.Cryptography.DpapiDataProtector» из сборки в .netcore. - person TAHA SULTAN TEMURI; 12.11.2019
comment
Немного удивлен, что 5 лет спустя основные документы asp.net по-прежнему не содержат полезной информации, которая поможет вам правильно использовать это... - person Douglas Gaskell; 14.11.2019

В ASP.NET Core в настоящее время можно настроить службу по умолчанию в Startup.cs следующим образом:

services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddDefaultTokenProviders();

Нет необходимости вызывать DpapiDataProtectionProvider или что-то в этом роде. DefaultTokenProviders() позаботится о вызове GenerateEmailConfirmationToken из UserManager.

person pisker    schedule 23.02.2017

В дополнение к принятому ответу я хотел бы добавить, что этот подход не будет работать на веб-сайтах Azure, вы получите CryptographicException вместо токена.

Чтобы исправить это для Azure, реализуйте свой собственный IDataProtector: см. этот ответ

Немного больше подробностей в сообщение в блоге

person trailmax    schedule 21.06.2014

Мое решение:

    var provider = new DpapiDataProtectionProvider("YourAppName");
    UserManager.UserTokenProvider = new DataProtectorTokenProvider<User, string>(provider.Create("UserToken")) 
        as IUserTokenProvider<User, string>;

Моя проблема с этим кодом решена.
Удачи, друзья.

person Amin Ghaderi    schedule 12.11.2014
comment
с помощью Microsoft.Owin.Security.DataProtection; - person Amin Ghaderi; 12.11.2014
comment
Мне пришлось использовать DataProtectorTokenProvider‹IdentityUser, string› вместо ‹User, string› для обоих дженериков. Кроме того, userId в GeneratePasswordResetToken — это идентификатор строки guid, а не имя пользователя или адрес электронной почты. - person Dan Randolph; 02.05.2017

На случай, если кто-то еще совершит ту же ошибку, что и я. Я попытался создать функцию, подобную приведенной ниже, и, конечно же, ошибка «Нет зарегистрированного IUserTokenProvider». пропал. Однако, как только я попытался использовать ссылку, сгенерированную из «callbackUrl», я получил сообщение об ошибке «Неверный токен». Чтобы это работало, вам нужно получить HttpContext UserManager. Если вы используете стандартное приложение ASP.NET MVC 5 с отдельными учетными записями пользователей, вы можете сделать это, как показано ниже.

Код, который работает:

public ActionResult Index()
     {
         //Code to create ResetPassword URL
         var userManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
         var user = userManager.FindByName("[email protected]");
         string code = userManager.GeneratePasswordResetToken(user.Id);
         var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
         return View();
     }

Первая попытка не работает, No IUserTokenProvider is registered. больше нет, но созданный URL получает Invalid token..

public ActionResult NotWorkingCode()
     {
             //DOES NOT WORK - When used the error "Invalid token." will always trigger.
             var provider = new DpapiDataProtectionProvider("ApplicationName");
             var userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(new ApplicationDbContext()));
             userManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(provider.Create("ASP.NET Identity"));
             var user = userManager.FindByName("[email protected]");
             string code = userManager.GeneratePasswordResetToken(user.Id);
             var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
             //DOES NOT WORK - When used the error "Invalid token." will always trigger.
         return View();
     }
person Ogglas    schedule 29.12.2015

Согласно пискеру выше

В startup.cs вы можете использовать

services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddDefaultTokenProviders();

В .net core 2.0 вам может понадобиться добавить в startup.cs:

using Microsoft.AspNetCore.Identity;

Это отлично сработало для меня.

person ScottC    schedule 22.08.2017
comment
Я думаю, важно помнить, что это решение для Asp .NET Core, оно не будет работать с Asp .NET Framework. - person Machado; 24.07.2018

При изменении файлов идентификации .NET Core я наткнулся на эту ошибку:

NotSupportedException: не зарегистрирован IUserTwoFactorTokenProvider с именем «Default».

То

Microsoft.AspNetCore.Identity.UserManager.GenerateUserTokenAsync

Функция не смогла сгенерировать токен, так как при регистрации нового пользователя не был доступен провайдер. Однако эту ошибку легко исправить!

Если вы похожи на меня, вы изменили AddDefaultIdentity в файле Startup.cs на AddIdentity. Я хотел реализовать своего собственного пользователя, унаследованного от базового пользователя. Сделав это, я потерял поставщиков токенов по умолчанию. Исправление заключалось в том, чтобы добавить их обратно с помощью AddDefaultTokenProviders().

        services.AddIdentity<User, UserRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

После этого исправления все снова заработало!

источник: https://mattferderer.com/NotSupportedException-No-IUserTwoFactorTokenProvider-tuser-named-default-registered

person Yawar Ali    schedule 13.07.2019

Я получил ту же ошибку после обновления Identity и обнаружил, что это произошло из-за того, что я использовал Unity.

См. эту ветку вопросов о решении: Register IAuthenticationManager with Unity

Также ниже для быстрого ознакомления:

Вот что я сделал, чтобы Unity хорошо работал с ASP.NET Identity 2.0:

Я добавил следующее в метод RegisterTypes в классе UnityConfig:

container.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager());
container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager());
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager());
container.RegisterType<AccountController>(new InjectionConstructor());
person Rob    schedule 03.02.2015
comment
Я последовал этому, но это не сработало (для GeneratePasswordResetToken - но получило ту же ошибку, что IUserTokenProvider не зарегистрирован). После добавления container.RegisterType<ApplicationUserManager>( new InjectionFactory(c => HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>())); к UnityConfig.cs все заработало. - person ; 20.04.2016

Вам также может быть интересно посмотреть здесь:
Как реализовать TokenProvider в ночной сборке ASP.NET Identity 1.1?
использовать реализация поставщика токенов по умолчанию из пакета Microsoft.Identity.Owin

person botang    schedule 11.12.2014

в IdentityConfig.cs добавьте двухфакторную опцию:

        manager.RegisterTwoFactorProvider("PhoneCode", new PhoneNumberTokenProvider<ApplicationUser>
        {
            MessageFormat = "Your security code is {0}"
        });
        manager.RegisterTwoFactorProvider("EmailCode", new EmailTokenProvider<ApplicationUser>
        {
            Subject = "Security Code",
            BodyFormat = "Your security code is {0}"
        });
        //config sms service 
        manager.SmsService = new Services.SMS();
        var dataProtectionProvider = options.DataProtectionProvider;
        if (dataProtectionProvider != null)
        {
            manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
        }
person Mohammad Reza Mrg    schedule 28.07.2018