У меня есть веб-интерфейс, вызывающий сервер ASP Web Api 2. Управление аутентификацией осуществляется с помощью ASP Identity. Для некоторых контроллеров, которые я создаю, мне нужно знать, что пользователь делает вызов. Я не хочу создавать какую-то странную модель для передачи, включая идентификатор пользователя (который я даже не храню в клиенте).
Все вызовы API разрешены с использованием маркера-носителя, я думаю, что контроллер должен иметь возможность определять контекст пользователя на основе этого, но я не знаю, как его реализовать. Я искал, но я не знаю, что именно ищу, и не нашел ничего подходящего. Я собираюсь что-то вроде...
public async Task<IHttpActionResult> Post(ApplicationIdentity identity, WalkthroughModel data)
Обновление
Я нашел следующее, которое выглядело очень многообещающим... но значение всегда равно нулю! Мой контроллер наследует от ApiController и имеет заголовок Authorize.
var userid = User.Identity.GetUserId();
Обновление 2
Я также пробовал все решения в Получить текущего пользователя в действии ApiController, не передавая идентификатор пользователя в качестве параметра, но никто не работает. Независимо от того, что я получаю Identity, который является действительным и auth'd, но имеет null UserID
Обновление 3
Здесь, где я сейчас.
[Authorize]
[Route("Email")]
public async Task<IHttpActionResult> Get()
{
var testa = User.Identity.GetType();
var testb = User.Identity.GetUserId();
var testc = User.Identity.AuthenticationType;
var testd = User.Identity.IsAuthenticated;
return Ok();
}
testa = Name: ClaimsIdentity, testb = null, testc = Bearer, testd = true
Пользователь явно аутентифицирован, но я не могу получить их идентификатор пользователя.
Обновление 4
Я нашел ответ, но я действительно недоволен этим...
ClaimsIdentity identity = (ClaimsIdentity)User.Identity;
string username = identity.Claims.First().Value;
Это дает мне имя пользователя без каких-либо вызовов db, но кажется, что это очень шумно и больно поддерживать в будущем. Было бы интересно, если бы у кого-то был лучший ответ.
Что делать, если мне нужно изменить, какие претензии выдаются по дороге? Плюс в любое время, когда мне действительно нужен идентификатор пользователя, я должен сделать вызов db для преобразования имени пользователя в идентификатор