ASP.NET Core 2 - GetUserIdAsync使用Guid ID返回null结果

时间:2018-02-10 14:52:37

标签: c# asp.net-core-2.0 asp.net-core-identity

我目前正在将网站移植到ASP.NET Core 2,当我使用扩展名为userManager.GenerateEmailConfirmationTokenAsync(user)的用户类调用IdentityUser<Guid>时,会抛出以下异常:

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()拨打UserManager.GetUserIdAsync()null正在Result中返回Write()User07c0423e-f36b-1410-8007-800000000000正在抱怨,即使是{{} 1}}我在Id中传递userManager.GetUserIdAsync(user)的实例。

如果我直接在我呼叫UserManager的同一个GenerateEmailConfirmationTokenAsync()实例上致电null,我会在Result中获得相同的{{1}}值

有没有人有任何想法如何解决这个问题?

修改:根据要求,可以在github.com/BenjaminNolan/GetUserIdAsyncNullExample

找到功能示例

1 个答案:

答案 0 :(得分:2)

您遇到的问题是User课程中的these lines

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

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

  

'User.Id'隐藏继承的成员'IdentityUser.Id'。

此警告会通知您,如果您通过Id引用(而不是User引用 - 基类)访问IdentityUser<Guid>,则您将使用不同的 Id属性。如果检查控制器中user.Id的值并将其与((IdentityUser<Guid>)user).Id的值进行比较,则可以看到这是什么样的(为了访问它的 Id财产)。

在您的案例中很容易修复 - 只需从Id类中移除User属性:您已经指定Id中的现有IdentityUser<TKey>属性将属于Guid类型且已配置为密钥等