我正在使用UserManagerASP.NET 5附带的内置类在我的站点上实现重置密码功能.
在我的开发环境中一切正常.但是,一旦我在作为Azure网站运行的生产站点中尝试它,我会得到以下异常:
System.Security.Cryptography.CryptographicException:数据保护操作失败.这可能是由于没有为当前线程的用户上下文加载用户配置文件引起的,这可能是线程模拟时的情况.
这是我设置UserManager实例的方式:
var provider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider(SiteConfig.SiteName);
UserManager.UserTokenProvider = new Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider<User>(provider.Create(ResetPasswordPurpose));
Run Code Online (Sandbox Code Playgroud)
然后,我生成令牌(通过电子邮件发送给用户,以便他们可以验证他们确实想要重置密码):
string token = UserManager.GeneratePasswordResetToken(user.Id);
Run Code Online (Sandbox Code Playgroud)
不幸的是,当它在Azure上运行时,我得到了上面的例外.
我用Google搜索并发现了这种可能的解决方案.但是,它根本不起作用,我仍然得到同样的例外.
根据该链接,它与会话令牌有关,这些会话令牌不在像Azure这样的Web场上工作.
我已经使用 ASP.NET Identity 2.2.1 成功构建了简单的注册系统。
我只需要 API,所以我构建了允许使用 route 创建帐户的简单控制器account/create,当创建帐户时,用户会收到带有确认电话所需的令牌的 SMS 消息,同时我生成验证电子邮件地址所需的链接,我正在将其发送到用户电子邮件地址。然后用户需要从 SMS 输入令牌(向 请求account/confirm_phone)并单击他收到的电子邮件中的链接。
激活账户需要这两个操作,这部分工作正常。
我需要将电子邮件链接更改为电子邮件令牌,类似于用于确认电话号码的令牌,因此用户不必单击链接,而是必须输入该令牌(请求到account/confirm_email)
方法GenerateEmailConfirmationTokenAsync返回很长的代码,成为电子邮件中发送的链接的一部分,我希望它返回 6 位令牌。
我无法重用,GeneratePhoneConfirmationTokenAsync因为这将生成与通过 SMS 发送相同的令牌。
我在互联网上搜索过,但找不到任何关于如何自定义GenerateEmailConfirmationTokenAsync方法生成的令牌的信息。
是否可以配置该令牌生成器,以便它返回 6(或任何可配置长度)数字代码,我可以用它来确认用户电子邮件地址。
我知道将链接发送给用户是更好的选择,但正如我写的那样,这是我得到的要求,我无法改变它。