重置Microsoft Identity上的密码会导致System.Security.Cryptography.CryptographicException

时间:2017-01-09 18:03:26

标签: c# asp.net asp.net-identity

我正在使用MS Identity,当我使用重置令牌重置密码时,我遇到了以下异常:

  

内部异常类型:   System.Security.Cryptography.CryptographicException内部异常:   数据保护操作失败。这可能是   由于没有为当前线程加载用户配置文件而导致   用户上下文,可能是线程模拟时的情况。

这就是代码的样子:

var TheProvider = new DpapiDataProtectionProvider();
UserManager<IdentityUser> TheUserManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>());
TheUserManager.UserTokenProvider = new DataProtectorTokenProvider<IdentityUser>(TheProvider.Create("EmailConfirmation"));

string TheResetCode = TheUserManager.GeneratePasswordResetToken(TheUserMembershiptID);

IdentityResult TheResult = TheUserManager.ResetPassword(TheUserMembershiptID, TheResetCode, TheNewPassword);

我在本地计算机上运行的是什么,但是当我将它放在服务器上时却没有。我环顾四周,但我还没有找到解决方案。我需要更改什么才能使其正常工作?

2 个答案:

答案 0 :(得分:2)

这是IIS的配置问题。转到应用程序池高级设置,然后设置选项&#34;加载用户配置文件&#34;到True

答案 1 :(得分:1)

这里的假设是您至少使用了Identity 3的版本以及OWIN和实体框架。

每次都不要手动创建数据保护提供程序。从应用程序构建器启动时获取它并将其存储以供用户管理器使用。

public static class Auth {
    internal static IDataProtectionProvider DataProtectionProvider { get; private set; }
}

public partial class Startup {
    public void ConfigureAuth(IAppBuilder app) {
        Auth.DataProtectionProvider = app.GetDataProtectionProvider();
        //...other code removed for brevity
    }
}

为成员资格信息持久性配置DbContext

public class MyIdentityDbContext : IdentityDbContext<IdentityUser> {
    public MyIdentityDbContext()
        : base("MembershipConnection") { }

    public static MyIdentityDbContext Create() {
        return new MyIdentityDbContext();
    }
}

现在创建一个UserManager派生类并将其配置为使用数据保护提供程序

public class IdentityUserManager : UserManager<IdentityUser> {

    private IdentityUserManager()
        : base(new UserStore<IdentityUser>(MyIdentityDbContext.Create())) {
        //...other code removed for brevity

        var dataProtectionProvider = Auth.DataProtectionProvider;
        if (dataProtectionProvider != null) {
            this.UserTokenProvider = new DataProtectorTokenProvider<IdentityUser>(dataProtectionProvider.Create("UserToken"));
        }
    }

    public static IdentityUserManager Create() {
        return new IdentityUserManager();
    }
}

现在假设您已在持久性存储中注册了用户,您应该能够生成令牌并重置密码。

var userManager = IdentityUserManager.Create();

var resetToken = await userManager.GeneratePasswordResetTokenAsync(id);

var result = await userManager.ResetPasswordAsync(id, resetToken, newPassword);

现在根据您的帖子给您发表评论,很可能是主机中的Load User Profile(假设IIS)需要设置为true

引用this回答

  

我有同样的问题,除了我在亚马逊ec2主办。我能够   通过转到IIS中的应用程序池来解决它(在   右键单击后设置过程模型的高级设置 - 加载   user profile = true。

如果是这种情况,并且您无法访问服务器以便能够像评论中所指示的那样更改该设置,那么社区可以提供的其他内容并没有被覆盖遇到这个特殊问题的帖子。