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
类型并且它已经被配置为密钥等
我目前正在将一个站点移植到 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
类型并且它已经被配置为密钥等