我目前正在将网站移植到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()
值User
,07c0423e-f36b-1410-8007-800000000000
正在抱怨,即使是{{} 1}}我在Id
中传递userManager.GetUserIdAsync(user)
的实例。
如果我直接在我呼叫UserManager
的同一个GenerateEmailConfirmationTokenAsync()
实例上致电null
,我会在Result
中获得相同的{{1}}值
有没有人有任何想法如何解决这个问题?
修改:根据要求,可以在github.com/BenjaminNolan/GetUserIdAsyncNullExample
找到功能示例答案 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
类型且已配置为密钥等