Asp.net mvc ASP.NET标识:在Azure网站上使用GeneratePasswordResetToken

Asp.net mvc ASP.NET标识:在Azure网站上使用GeneratePasswordResetToken,asp.net-mvc,azure,asp.net-identity,forgot-password,Asp.net Mvc,Azure,Asp.net Identity,Forgot Password,我在Microsoft Azure上部署了我的web应用程序。但是,当我想要生成具有以下内容的PasswordResetToken时: var token = await _userManager.GeneratePasswordResetTokenAsync(user.Id); 我得到以下错误: System.Security.Cryptography.CryptographyException:数据保护操作未成功。这可能是由于没有为当前线程的用户上下文加载用户配置文件造成的,这可能是线程正

我在Microsoft Azure上部署了我的web应用程序。但是,当我想要生成具有以下内容的PasswordResetToken时:

var token = await _userManager.GeneratePasswordResetTokenAsync(user.Id);
我得到以下错误:

System.Security.Cryptography.CryptographyException:数据保护操作未成功。这可能是由于没有为当前线程的用户上下文加载用户配置文件造成的,这可能是线程正在模拟的情况

我如何让它在Azure上工作

或者有没有其他方法可以在不知道旧密码的情况下重置密码

这是我的UserManager类。梅比:这里面有个错误

public class ApplicationUserManager : UserManager<ApplicationIdentityUser>
{
    private static IUnitOfWork _unitOfWork;
    private readonly IRepository<ApplicationIdentityUser> _userRepository;


    public ApplicationUserManager(IUserStore<ApplicationIdentityUser> store, IRepository<ApplicationIdentityUser> userRepository)
        : base(store)
    {
        if (userRepository == null) throw new ArgumentNullException("userRepository");

        _userRepository = userRepository;

        if (bool.Parse(ConfigurationManager.AppSettings["RunningInAzure"]))
            UserTokenProvider = new EmailTokenProvider<ApplicationIdentityUser, string>();
        else
        {
            var provider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("TopRijden");
            UserTokenProvider = new DataProtectorTokenProvider<ApplicationIdentityUser, string>(provider.Create("Password Reset"));
        }
    }


    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
    {
        if (options == null) throw new ArgumentNullException("options");
        if (context == null) throw new ArgumentNullException("context");

        try
        {
            _unitOfWork = ObjectFactory.GetInstance<IUnitOfWork>();
            var userRepository = ObjectFactory.GetInstance<IRepository<ApplicationIdentityUser>>();

            var manager = new ApplicationUserManager(new UserStore<ApplicationIdentityUser>(_unitOfWork.Session), userRepository);

            // Configure validation logic for usernames
            manager.UserValidator = new UserValidator<ApplicationIdentityUser>(manager)
            {
                AllowOnlyAlphanumericUserNames = false,
                RequireUniqueEmail = true
            };

            // Configure validation logic for passwords
            manager.PasswordValidator = new PasswordValidator
            {
                RequiredLength = 6,
                RequireNonLetterOrDigit = true,
                RequireDigit = true,
                RequireLowercase = true,
                RequireUppercase = true,
            };

            // Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user
            // You can write your own provider and plug in here.
            manager.RegisterTwoFactorProvider("PhoneCode", new PhoneNumberTokenProvider<ApplicationIdentityUser>
            {
                MessageFormat = "Your security code is: {0}"
            });

            manager.RegisterTwoFactorProvider("EmailCode", new EmailTokenProvider<ApplicationIdentityUser>
            {
                Subject = "Security Code",
                BodyFormat = "Your security code is: {0}"
            });

            var dataProtectionProvider = options.DataProtectionProvider;
            if (dataProtectionProvider != null)
            {
                manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationIdentityUser>(dataProtectionProvider.Create("ASP.NET Identity"));
            }

            return manager;
        }
        catch (Exception ex)
        {
            ex.Process(MethodBase.GetCurrentMethod().DeclaringType, MethodBase.GetCurrentMethod().Name);

            return null;
        }
    }      
}
公共类应用程序管理员:用户管理员
{
私有静态i工作单元(unitof工作单元);;
私有只读IRepository用户存储库;
公共应用程序用户管理器(IUserStore、IRepository用户存储库)
:基地(商店)
{
如果(userRepository==null)抛出新的ArgumentNullException(“userRepository”);
_userRepository=userRepository;
if(bool.Parse(ConfigurationManager.AppSettings[“RunningInAzure”]))
UserTokenProvider=新的EmailTokenProvider();
其他的
{
var provider=new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider(“TopRijden”);
UserTokenProvider=newDataProtectorTokenProvider(provider.Create(“密码重置”));
}
}
公共静态应用程序SerManager创建(IdentityFactoryOptions选项,IOwinContext上下文)
{
如果(options==null)抛出新的ArgumentNullException(“options”);
如果(context==null)抛出新的ArgumentNullException(“context”);
尝试
{
_unitOfWork=ObjectFactory.GetInstance();
var userRepository=ObjectFactory.GetInstance();
var manager=newapplicationUserManager(newuserstore(\u unitOfWork.Session),userRepository);
//为用户名配置验证逻辑
manager.UserValidator=新的UserValidator(管理器)
{
AllowOnlyAlphanumericUserNames=false,
RequireUniqueEmail=true
};
//配置密码的验证逻辑
manager.PasswordValidator=新密码验证器
{
所需长度=6,
RequiredOnletterDigit=真,
RequireDigit=true,
RequireLowercase=true,
RequireUppercase=true,
};
//注册双因素身份验证提供商。此应用程序使用电话和电子邮件作为接收验证用户代码的步骤
//您可以编写自己的提供程序并在此处插入。
manager.RegisterWofactorProvider(“PhoneCode”,新的PhoneNumberTokenProvider
{
MessageFormat=“您的安全代码为:{0}”
});
manager.RegisterWofactorProvider(“EmailCode”,新的EmailTokenProvider
{
Subject=“安全代码”,
BodyFormat=“您的安全代码为:{0}”
});
var dataProtectionProvider=options.dataProtectionProvider;
if(dataProtectionProvider!=null)
{
manager.UserTokenProvider=newdataprotectortokenprovider(dataProtectionProvider.Create(“ASP.NET标识”);
}
退货经理;
}
捕获(例外情况除外)
{
例如进程(MethodBase.GetCurrentMethod().DeclaringType,MethodBase.GetCurrentMethod().Name);
返回null;
}
}      
}

}

在UserManager中使用
EmailTokenProvider

public UserManager() : base(new UserStore<ApplicationUser>(new MyDbContext()))
{
    // other setup
    this.UserTokenProvider = new EmailTokenProvider<ApplicationUser, string>();
}

public UserManager():base(new UserStore.

根据trailmax的答案,我找到了解决我自己问题的有效方法

我使用ToTPSecuritySampbasedTokenProvider代替EmailTokenProvider

public UserManager() : base(new UserStore<ApplicationUser>(new MyDbContext()))
{
    // other setup
    this.UserTokenProvider = new TotpSecurityStampBasedTokenProvider<ApplicationUser, string>();
}

public UserManager():base(new UserStore

您正在谈论类似的内容吗?不幸的是,它不起作用。我用UserManager类编辑了我的问题。可能中有一个错误。当我使用EmailTokenProvider时,我也会遇到以下错误:System.NotSupportedException:没有注册IUserTokenProvider。我认为您有太多的选项无法注册oken提供程序可以注册。简化用户管理器的创建,确保您只注册了一个2FA提供程序,只在一个位置设置
UserTokenProvider
。目前,即使您在构造函数中设置了电子邮件令牌提供程序,也可以在静态
Create
方法中覆盖它。我简化了用户管理器,以便只启用e分配UserTokenProvider时,我仍然得到异常:(。EmailTokenProvider在我的本地IIS环境中不工作。这对我也有效。@DeVliegendeBeer:您可以将此答案标记为已回答。