Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Microsoft Identity上重置密码会导致System.Security.Cryptography.CryptographyException异常_C#_Asp.net_Asp.net Identity - Fatal编程技术网

C# 在Microsoft Identity上重置密码会导致System.Security.Cryptography.CryptographyException异常

C# 在Microsoft Identity上重置密码会导致System.Security.Cryptography.CryptographyException异常,c#,asp.net,asp.net-identity,C#,Asp.net,Asp.net Identity,我使用的是MS Identity,当我使用重置令牌重置密码时,会出现以下异常: 内部异常类型: System.Security.Cryptography.CryptographyException内部异常: 数据保护操作失败。这可能是 由于未加载当前线程的用户配置文件而导致 用户上下文,这可能是线程模拟时的情况 这是代码的样子: var TheProvider = new DpapiDataProtectionProvider(); UserManager<IdentityUser>

我使用的是
MS Identity
,当我使用重置令牌重置密码时,会出现以下异常:

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

这是代码的样子:

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);
var TheProvider=new DpapiDataProtectionProvider();
UserManager TheUserManager=newusermanager(newuserstore());
usermanager.UserTokenProvider=newdataprotector或tokenprovider(provider.Create(“EmailConfirmation”);
字符串TheResetCode=UserManager.GeneratePasswordResetToken(UserMembershipTID);
IdentityResult TheResult=usermanager.ResetPassword(usermembershipTID、resetcode、newpassword);

我所拥有的东西在我的本地机器上工作,但当我把它放在服务器上时就不行了。我环顾四周,但没有找到解决办法。我需要更改什么才能使其正常工作?

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

这里的假设是您至少使用了Identity的版本3以及OWIN和entity framework

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

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();
    }
}
因此,现在假设您在持久性存储中注册了用户,您应该能够生成令牌并重置密码

var userManager = IdentityUserManager.Create();

var resetToken = await userManager.GeneratePasswordResetTokenAsync(id);

var result = await userManager.ResetPasswordAsync(id, resetToken, newPassword);
现在,根据您在文章中的评论,很可能主机中的
加载用户配置文件
(假设IIS)需要设置为
true

引用答案

除了在AmazonEC2上托管之外,我也有同样的问题。我能 要解决此问题,请转到IIS中的应用程序池,然后(在 右键单击后的高级设置)设置流程模型-加载 用户配置文件=true


如果是这种情况,并且您没有访问服务器的权限,无法像您在评论中指出的那样更改该设置,那么社区可以提供的其他内容也就不多了,这些内容还没有在遇到此特定问题的帖子中介绍过。

我在其他地方看到了此选项的答案,但我没有访问IIS的权限,它是共享主机(现在)。有什么理由像这样手动构造令牌提供程序吗?不使用框架构造的工具?@trailmax:我对所有选项都持开放态度。在这种情况下,请尝试此解决方案:看看是否存在相同的问题。@frenchie您使用的是OWIN吗?不要手动创建提供程序。从应用程序启动时获取它。这就是解决方案。
var userManager = IdentityUserManager.Create();

var resetToken = await userManager.GeneratePasswordResetTokenAsync(id);

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