ASP.NET Identity:在 Azure 网站上使用 GeneratePasswordResetToken

Posted

技术标签:

【中文标题】ASP.NET Identity:在 Azure 网站上使用 GeneratePasswordResetToken【英文标题】:ASP.NET Identity: use GeneratePasswordResetToken on Azure website 【发布时间】:2014-11-02 14:38:37 【问题描述】:

我的 Web 应用程序部署在 Microsoft Azure 上。但是,当我想生成 PasswordResetToken 时:

var token = await _userManager.GeneratePasswordResetTokenAsync(user.Id);

我收到以下错误:

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

如何让它在 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;
        
          

【问题讨论】:

你在说这样的事情吗? asp.net/identity/overview/features-api/… 【参考方案1】:

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

我使用 TotpSecurityStampBasedTokenProvider 代替 EmailTokenProvider

public UserManager() : base(new UserStore<ApplicationUser>(new MyDbContext()))

    // other setup
    this.UserTokenProvider = new TotpSecurityStampBasedTokenProvider<ApplicationUser, string>();

有关 TotpSecurityStampBasedTokenProvider 的更多信息: http://msdn.microsoft.com/en-us/library/dn613297(v=vs.108).aspx

【讨论】:

这对我也有用。 @DeVliegendeBeer:您可以将此答案标记为已回答。【参考方案2】:

在用户管理器中使用EmailTokenProvider

public UserManager() : base(new UserStore<ApplicationUser>(new MyDbContext()))

    // other setup
    this.UserTokenProvider = new EmailTokenProvider<ApplicationUser, string>();

我有blogged about it recently。

【讨论】:

不幸的是它不起作用。我用我的 UserManager 类编辑了我的问题。 Mabey 中出现错误。 我在使用 EmailTokenProvider 时也收到以下错误: System.NotSupportedException: No IUserTokenProvider is registered. 我认为您可以注册令牌提供者的选项太多。简化您的用户管理器创建,确保您只注册了一个 2FA 提供程序,只有一个地方可以设置UserTokenProvider。目前,即使您在构造函数中设置了电子邮件令牌提供者,也可以在静态Create 方法中覆盖它。 我简化了用户管理器,以便只分配一次 UserTokenProvider,但我仍然得到异常 :(。EmailTokenProvider 在我的本地 IIS 环境中不起作用。

以上是关于ASP.NET Identity:在 Azure 网站上使用 GeneratePasswordResetToken的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft.AspNetCore.Identity 与 Azure ActiveDirectory

Azure AD 与 ASP.NET Core MVC 中的标识

ASP.NET Identity教程ASP.NET Identity入门

ASP.NET Identity系列教程运用ASP.NET Identity

[ASP.NET MVC] ASP.NET Identity登入技术剖析

asp.net identity 3.0.0 在MVC下的基本使用 序言