我正在尝试在Azure中运行的基于OWIN/Katana的ASP .NETMVC网站上实现密码重置。
它在本地运行时工作正常,但在生产中失败。
我创建了一个UserToken提供程序
userManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(provider.Create("PasswordReset"))
但当我尝试按如下方式生成令牌时
var resetToken = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
我得到以下异常。
System.Security.Cryptography.CryptographicException:数据保护操作未成功。这可能是由于没有为当前线程的用户上下文加载用户配置文件造成的,当线程正在模拟时可能会出现这种情况。at System.Security.Cryptography.ProtectedData.Protect(字节[]用户数据,字节[]可选熵,DataProtectionScope作用域)位于系统.安全.加密.DpapiDataProtector.提供程序保护(Byte[] userData)位于系统.安全.加密.数据保护.保护(字节[]用户数据)在Microsoft.Owin.安全.数据保护.DpapiDataProtector.保护(字节[]用户数据)在Microsoft.AspNet.身份.Owin.数据保护器令牌提供程序2.d__0.移动下一步()---从前一个引发异常的位置开始的堆栈跟踪结尾---在系统.运行时.编译器服务.任务等待.ThrowForNonSuccess(任务任务)在系统.运行时.编译器服务.任务等待.HandleNonSuccessAndDebuggerNotification(任务任务)在Microsoft.AspNet.标识.用户管理器'2.d__e9.MoveNext()
8条答案
按热度按时间uqjltbpv1#
如果主机服务器是虚拟机,则可能与错误消息所述完全相同。请检查IIS中的应用程序池是否真的将
Load User Profile
设置为true,如异常所示:k10s72fa2#
当我尝试使用ASP.NET标识和Web API中的自定义登录函数生成令牌时,我遇到了同样的问题。
数据保护操作未成功。这可能是由于没有为当前线程的用户上下文加载用户配置文件造成的,当线程正在模拟时可能会出现这种情况。
我所做的只是在Microsoft Azure中创建一个名为
WEBSITE_LOAD_USER_PROFILE
的应用程序设置,并将其设置为1。您可以看到详细信息here
b91juud33#
这个问题请参考我的my answer。使用
IAppBuilder.GetDataProtectionProvider()
可以实现一个简单得多的解决方案bwleehnv4#
我找到了一个解决方案。我不确定是否所有的步骤都是必要的,但现在我的应用程序运行得很完美:
1.-更新您的web.config以支持安全令牌处理程序
在configSections节点中。并且
2.-在Startup.Auth.cs文件中,按如下方式更新ConfigureAuth(IAppBuilder应用程序):
3.-像这样清理Startup类的构造函数:
那对我很有效:)我希望对你也很有效
qf9go6mv5#
这个错误发生在我的共享主机提供商,在行:
解决方法很简单,首先将上面的行改为:
然后创建一个新文件,它在Utilities命名空间中,如下所示:
瞧!问题解决了。只要记住,在密码重置控制器方法中,您还必须使用此提供程序,否则您将得到一个
Invalid Token
错误。xfyts7mz6#
我把这个问题搁置了一段时间,但不得不重新考虑。我在这里找到了解决办法:Generating reset password token does not work in Azure Website
q1qsirdb7#
从Owin管道获取UserManager(如App_Start/Startup.Auth.cs中的设置)可在Azure上工作。我不确定具体如何工作。DpApi应在Azure中与第一个链接中描述的解决方案一起工作。
如果DpApi在Web.config中设置了一个静态机器密钥,那么所有服务器机器都将能够解密由网络场中的另一台机器创建的加密数据,这是对这一点的理解。
(code如标准模板中所示-来自AccountController.cs)
kupeojn68#
在我和另外两个人处理这个错误几天后,我们发现IIS中有一些有趣的东西。如果加载用户配置文件被切换,则在applicationhost.config中创建以下内容
但是当你关掉它的时候它也能工作,但是现在这条线
所以不同之处在于必须在applicationhost.config中写入默认值才能使其工作