繁体   English   中英

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

[英]Resetting password on Microsoft Identity causes System.Security.Cryptography.CryptographicException

我正在使用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);

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

这是IIS的配置问题。 转到应用程序池高级设置,并将“加载用户配置文件”选项设置为True

这里的假设是您至少使用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

引用这个答案

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM