C# 没有注册IUserTokenProvider

C# 没有注册IUserTokenProvider,c#,asp.net,asp.net-identity-2,C#,Asp.net,Asp.net Identity 2,我最近将我的申请表1.0的Asp.Net身份核心更新为2.0 我想尝试一些新功能,比如GenerateEmailConfirmationToken,等等 我用这个项目作为参考 当用户尝试注册时,我在执行register的Post方法时出错 private readonly UserManager<ApplicationUser> _userManager; public ActionResult Register(RegisterViewModel model) {

我最近将我的申请表1.0的Asp.Net身份核心更新为2.0

我想尝试一些新功能,比如
GenerateEmailConfirmationToken
,等等

我用这个项目作为参考

当用户尝试注册时,我在执行register的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);
}
我听到的错误是:

No IUserTokenProvider is registered.
现在,我只想看看它会生成什么样的代码。 是否需要对继承自
IdentityUser
类的
ApplicationUser
类进行一些更改


或者我需要更改哪些内容才能使这些函数正常工作?

您必须指定一个
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"));

使用Microsoft.Owin.Security.DataProtection;
使用Microsoft.AspNet.Identity.Owin;
// ...
var provider=新的DpapiDataProtectionProvider(“SampleAppName”);

var userManager=new userManager。

除了接受的答案之外,我想补充一点,这种方法在Azure网站中不起作用,您将获得CryptographicException而不是令牌

要为Azure修复它,请实现您自己的IDataProtector:


有关详细信息,请参见我的解决方案:

    var provider = new DpapiDataProtectionProvider("YourAppName");
    UserManager.UserTokenProvider = new DataProtectorTokenProvider<User, string>(provider.Create("UserToken")) 
        as IUserTokenProvider<User, string>;
var provider=new DpapiDataProtectionProvider(“YourAppName”);
UserManager.UserTokenProvider=新的DataProtectorTokenProvider(provider.Create(“UserToken”))
作为供应商;
我的代码问题已解决。

祝你好运,朋友们。

你可能也对这里感兴趣:


要使用Microsoft.Identity.Owin包中的默认令牌提供程序实现,我在更新Identity后遇到了相同的错误,并发现这是因为我使用的是Unity

请参阅解决方案上的此问题线程:

以下内容供快速参考:

以下是我为使Unity更好地使用ASP.NET Identity 2.0所做的工作:

我在
UnityConfig
类中的
RegisterTypes
方法中添加了以下内容:

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());
container.RegisterType(新的层次结构CallifetimeManager());
RegisterType(新的层次结构CallifetimeManager());
RegisterType(新的层次结构CallifetimeManager());
RegisterType(新的InjectionConstructor());

以防其他人犯了和我一样的错误。我尝试创建一个类似于下面的函数,并且确信错误“No IUserTokenProvider is registered.”已经消失。然而,当我尝试使用从“callbackUrl”生成的链接时,我得到了错误“Invalid token”。为了让它工作,您需要获取HttpContext用户管理器。如果您将标准ASP.NET MVC 5应用程序与单个用户帐户一起使用,您可以按如下方式进行操作

有效的代码:

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

在ASP.NET Core中,现在可以在Startup.cs中配置默认服务,如下所示:

services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddDefaultTokenProviders();
services.AddIdentity()
.AddDefaultTokenProviders();
不需要调用
DpapiDataProtectionProvider
或类似的东西。DefaultTokenProviders()将负责从UserManager调用GenerateEmailConfirmationToken。

如上所述

在startup.cs中,您可以使用

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

这对我来说很好。

在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"));
        }
manager.RegisterWofactorProvider(“PhoneCode”,新的PhoneNumberTokenProvider
{
MessageFormat=“您的安全代码为{0}”
});
manager.RegisterWofactorProvider(“EmailCode”,新的EmailTokenProvider
{
Subject=“安全代码”,
BodyFormat=“您的安全代码为{0}”
});
//配置短信服务
manager.SmsService=new Services.SMS();
var dataProtectionProvider=options.dataProtectionProvider;
if(dataProtectionProvider!=null)
{
manager.UserTokenProvider=newdataprotectortokenprovider(dataProtectionProvider.Create(“ASP.NET标识”);
}

在修改.NET Core的标识文件时,我偶然发现了以下错误:

NotSupportedException:未指定IUserTwoFactorTokenProvider “默认”已注册

Microsoft.AspNetCore.Identity.UserManager.GenerateUserTokenAsync

函数无法生成令牌,因为注册新用户时没有可用的提供程序。不过,这个错误很容易解决

如果您像我一样,您将
Startup.cs
文件中的
AddDefaultIdentity
更改为
AddIdentity
。我想实现从基本用户继承的我自己的用户。通过这样做,我丢失了默认的令牌提供程序。修复方法是使用
AddDefaultTokenProviders()
将它们添加回

services.AddIdentity()

.AddEntityFrameworkStores

什么是
“示例”
“电子邮件确认”
?一些文本可以是任何内容?“Sample”=AppName,“EmailConfirmation”=purpose(如参数名)是的,但您必须使用相同的文本来生成和验证令牌链接正常。您将此代码放在初始化
UserManager
的位置,这会导致在.netcore中使用Microsoft.Owin.Security.DataProtection从程序集中“无法加载类型”System.Security.Cryptography.DpapiDataProtector;我不得不使用DataProtectorTokenProvider,而不是两个泛型。此外,GeneratePasswordResetToken中的用户Id是guid字符串Id,而不是用户名或电子邮件。是否有任何方法可以根据电子邮件地址以外的其他字段检查用户是否存在?例如,如果我有两个名为CustomerNumber和Postcode的字段,用于数据库中已经存在的用户阻止来自registeringI的任何人,那么我遵循了这一点,但它不起作用(对于
GeneratePasswordResetToken
——但得到了相同的错误“没有注册IUserTokenProvider”)。添加
container.RegisterType后(在
services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddDefaultTokenProviders();
using Microsoft.AspNetCore.Identity;
        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"));
        }
        services.AddIdentity<User, UserRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();