UserManager:不同Web应用程序中的GenerateEmailConfirmationTokenAsync()和ConfirmEmailAsync()

时间:2019-01-29 13:36:46

标签: c# asp.net-identity-2 asp.net-core-mvc-2.1

我有2个ASP MVC Core Web应用程序(引用Microsoft.AspNetCore.App, Version 2.1.1)。两者都在我的计算机上的Visual Studio中本地运行。

  1. 如果我在第一个Web应用程序中调用
    var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
  1. 然后在第二个Web应用程序上
    var result = await _userManager.ConfirmEmailAsync(user, code);

我得到了结果"Invalid token."


我读过ASP.NET Core 2.0 - ASP.NET Identity - Invalid Token Error,但是我的问题有所不同。它在本地也不行!

(我想设置machineKey无济于事,因为这两个应用程序都在我的本地计算机上运行。即使我本地没有web.config。)

1 个答案:

答案 0 :(得分:1)

令牌被持久化到数据库中,因此您所需要的只是能够在另一端正确地对其进行解密。为此,如果两个应用程序均为ASP.NET Core,则只需为两个应用程序设置数据保护提供程序即可连接到相同的外部存储并使用相同的应用程序名称。外部存储可以是网络位置,映射的驱动器,Azure Key Vault等。您应该查看full documentation,但本质上是:

services.AddDataProtection()
    .SetApplicationName("shared app name")
    .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"));

您可能需要分配一个应用程序作为主钥匙圈管理器,也可能不需要。默认情况下,每个应用程序都会自动旋转键,如果您有多个共享相同键的应用程序,则可能会出现问题。您可以通过以下方式逐个应用禁用密钥轮换:

services.AddDataProtection()
    .DisableAutomaticKeyGeneration();

基本上,您要将其添加到所有从属应用程序中,仅保留您指定为旋转键的主要应用程序。