ASP.NET Core 2 — GetUserIdAsync возвращает нулевой результат с идентификаторами GUID

В настоящее время я переношу сайт на 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 в Id.

Если я вызываю userManager.GetUserIdAsync(user) непосредственно для того же экземпляра UserManager, для которого я вызываю GenerateEmailConfirmationTokenAsync(), я получаю то же самое значение null в Result.

У кого-нибудь есть идеи, как это решить?

Изменить. По запросу функциональный пример можно найти по адресу github.com/BenjaminNolan/GetUserIdAsyncNullExample.


person Benjamin Nolan    schedule 10.02.2018    source источник
comment
@NickPolideropoulos Я загрузил «рабочий» пример на github.com/BenjaminNolan/GetUserIdAsyncNullExample.   -  person Benjamin Nolan    schedule 10.02.2018


Ответы (1)


У вас возникла проблема с этими строками из вашего User класса:

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

Использование вами нового модификатора здесь подавляется следующее предупреждение компилятора:

«User.Id» скрывает унаследованный член «IdentityUser.Id».

Это предупреждение информирует вас о том, что если вы обращаетесь к Id через ссылку User (а не, например, через ссылку IdentityUser<Guid> — базовый класс), вы будете работать с другим свойством Id. Вы можете увидеть, как это выглядит, если вы проверите значение user.Id в своем контроллере и сравните его со значением ((IdentityUser<Guid>)user).Id (приведение к базовому классу для доступа к его свойству Id).

В вашем случае это легко исправить — просто удалите свойство Id из вашего класса User: вы уже указали, что существующее свойство Id из IdentityUser<TKey> будет иметь тип Guid, и оно уже настроено как ключ и т. д.

person Kirk Larkin    schedule 10.02.2018