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);