MVC ResetPasswordAsync无法在其他网站上运行

时间:2020-11-05 16:13:23

标签: c# asp.net-mvc-4 asp.net-identity

我有2个Web应用程序具有完全相同的代码,只是跨Azure部署的身份验证方法不同,即站点A(表单身份验证)和站点B(Windows身份验证)

这是生成令牌的代码段,我在2个不同的控制器中具有相同的代码 帐户和AdminReset

var UserManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
var code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
var encoded = HttpUtility.UrlEncode(code);

我用于重置密码的代码是(在帐户控制器中)-

var result = await UserManager.ResetPasswordAsync(model.UserId, HttpUtility.UrlDecode(model.Code), model.Password);
if (result.Succeeded)
                {
                    //do something
                }            

当我从站点B作为用户的管理员生成令牌时会遇到问题(在站点A上生成密码重置URL),当我尝试在站点A上重置密码时,它提示令牌无效

如果我以普通用户身份在站点A上生成令牌,并在站点A中将其重置,则效果很好。

是由于令牌是在不同网站上生成的吗?

1 个答案:

答案 0 :(得分:0)

当您使用GeneratePasswordResetTokenAsync调用生成令牌时,ASP.NET Identity使用内置的Data Protection APIs创建一个加密的令牌。

数据保护API使用“密钥环”来加密和解密令牌。默认情况下,此“密钥环”存储在服务器文件系统本地。 here.

中记录了此行为

应用程序使用ASP.NET Core数据保护系统来保护数据。数据保护依赖于存储在密钥环中的一组加密密钥。初始化数据保护系统后,它将应用默认设置,该默认设置将密钥环存储在本地。在默认配置下,唯一密钥环存储在Web场的每个节点上。因此,每个Web场节点都无法解密由其他任何节点上的应用程序加密的数据。

在您的方案中,因为重置令牌是在站点B中生成的,然后在站点A中使用的,所以无法解密该令牌。站点A不知道如何解密站点B生成的令牌,因为它们不共享相同的“密钥环”。

为解决此问题,您需要将站点A和站点B都配置为使用中央(安全)位置来存储“ {Key 3”,如here.

所示。