ASP.NET 核心 2 - GetUserIdAsync 返回带 Guid ID 的空结果

ASP.NET Core 2 - GetUserIdAsync returning null Result with Guid Ids

我目前正在将一个站点移植到 ASP.NET Core 2,当我调用 userManager.GenerateEmailConfirmationTokenAsync(user) 给扩展 IdentityUser<Guid> 的用户 class 时,抛出了以下异常:

System.ArgumentNullException: Value cannot be null.
Parameter name: value
   at System.IO.BinaryWriter.Write(String value)
   at Microsoft.AspNetCore.Identity.DataProtectorTokenProvider`1.<GenerateAsync>d__11.MoveNext()

GenerateAsync() makes a call to UserManager.GetUserIdAsync(),它返回 Result 中的 null 值,Write() 抱怨,即使我是 User 实例路过有07c0423e-f36b-1410-8007-800000000000 in Id.

如果我直接在调用 GenerateEmailConfirmationTokenAsync() 的同一个 UserManager 实例上调用 userManager.GetUserIdAsync(user),我会在 Result 中得到相同的 null 值.

有人知道如何解决这个问题吗?

编辑:根据要求,可以在 github.com/BenjaminNolan/GetUserIdAsyncNullExample

找到一个功能示例

您遇到的问题是 these lines 来自您的 User class:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[DefaultValue("NEWSEQUENTIALID()")]
new public Guid Id { get; set; }

您在此处使用 new modifier 会抑制以下编译器警告:

'User.Id' hides inherited member 'IdentityUser.Id'.

此警告通知您,如果您通过 User 引用访问 Id(而不是例如 IdentityUser<Guid> 引用 - 基础 class),您将使用 不同的 Id 属性。如果您在控制器中检查 user.Id 的值并将其与 ((IdentityUser<Guid>)user).Id 的值进行比较(转换为基础 class 以访问 Id 属性).

您的情况很容易修复 - 只需从 User class 中删除 Id 属性:您已经指定现有的 Id 来自 IdentityUser<TKey> 的 属性 将是 Guid 类型并且它已经被配置为密钥等