ClaimTypes.NameIdentifier всегда возвращает null в Blazor WebAssembly ASP.NET Core Hosted

Я установил Blazor WebAssembly ASP.NET Core hostedприложение и интегрировал систему аутентификации, а также пользовательский AuthenticationProvider для клиента. В проекте на стороне сервера я вызываю в контроллере следующее:

[HttpGet]
public async Task<ActionResult> GetObjects()
{
   var id = User.FindFirstValue(ClaimTypes.NameIdentifier); // <-- returns always null
}

а переменная id всегда возвращает ноль.

Пользователь из таблицы aspnetcoreuser (идентификатор aspnetcore). Поскольку я использую SQLite, я вижу, что идентификатор не равен нулю, и что пользователи были успешно добавлены в таблицу aspnetuser.

Некоторые версии SDK:

Установленные SDK для .NET Core: 3.1.301 Установленные среды выполнения .NET Core: Microsoft.AspNetCore.All 2.1.19 Microsoft.AspNetCore.App 2.1.19Microsoft.AspNetCore.App 3.1.5 Microsoft.NETCore.App 2.1.19 Microsoft.NETCore. Приложение 3.1.5 Microsoft.WindowsDesktop.App 3.1.5

Также я видел некоторые решения, которые могут вызывать "windowsAuthentication": true, "anonymousAuthentication": false, из launchSettings.json, но с изменениями он не решил это для меня.

Кто-нибудь здесь может мне помочь?


person brstkr    schedule 08.07.2020    source источник


Ответы (1)


Вам необходимо установить UserIdClaimType в серверном приложении, добавив этот код в Startup.ConfigureServices:

services.Configure<IdentityOptions>(options => 
    options.ClaimsIdentity.UserIdClaimType = ClaimTypes.NameIdentifier);

подробнее здесь

person nahidf    schedule 09.07.2020
comment
Спасибо за ответ! Правильно, отсутствует зависимость от сервера, но теперь я получаю исключение: System.NullReferenceException: "Object reference not set to an instance of an object." - person brstkr; 09.07.2020
comment
Я заметил, что пользователь обычно имеет значение NULL внутри контроллера. Мне не хватает регистрации зависимости? Думал, что контроллер имеет доступ к пользователю по умолчанию без интеграции какого-либо httpcontext. - person brstkr; 10.07.2020
comment
как настроено серверное приложение? В модели клиент / сервер мы должны использовать токен доступа для вызова API защищенного ресурса в серверном приложении. и серверное приложение должно быть настроено для чтения токена и авторизации. Можете ли вы подтвердить, что это то, что у вас есть? - person nahidf; 10.07.2020
comment
Спасибо за ссылку. Помогло прояснить мою проблему с GetUserAsync (User), возвращающим Null. Пришлось установить правильные ClaimTypes. - person eaglei22; 28.04.2021