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



Я в последнее время обновляется!--3--> моей заявки от 1.0 до 2.0.



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



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



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



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 класса?



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

548   9  

9 ответов:

вы должны указать 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 идентичность.

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

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

чуть подробнее в блоге

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

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

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

мое решение :

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

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

в случае, если кто-то еще сделает ту же ошибку, что и я. Я попытался сделать функцию, подобную приведенной ниже, и, конечно же, ошибка "no IUserTokenProvider is registered." пропавший. Однако как только я попытался использовать ссылку, сгенерированную из "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();
     }

согласно pisker выше

в автозагрузку.CS вы можете использовать

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

в .net core 2.0 вам может потребоваться добавить в запуск.cs:

using Microsoft.AspNetCore.Identity;

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

вы также можете быть заинтересованы в поиске здесь:
как реализовать TokenProvider в ASP.NET идентичность 1.1 ночной сборки?
чтобы использовать реализацию поставщика маркеров по умолчанию от корпорации Майкрософт.Тождественность.Owin package

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

см. этот вопрос поток на решение: Регистрация IAuthenticationManager с Unity

и ниже для быстрой справки:

вот что я сделал, чтобы заставить Unity играть хорошо ASP.NET идентичность 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());

в 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"));
        }

Comments

    Ничего не найдено.