Могу ли я получить доступ к IIdentity из веб-API

Я добавляю некоторые службы веб-API к существующему приложению MVC. У меня есть модельное связующее для моих MVC-контроллеров, чтобы получить пользовательский объект, хранящийся в CustomIdentity. Я пытаюсь воспроизвести это для моих действий веб-API.

В MVC Controller или его связующих я могу использовать

controllerContext.HttpContext.User.Identity

ApiController не имеет объекта HttpContext. Есть ли вообще доступ к объекту IIdentity из веб-API?

Ответ 2

Да, вы можете. ApiController имеет свойство Request типа System.Net.Http.HttpRequestMessage; это содержит сведения о текущем запросе естественным образом (у него также есть сеттер для целей тестирования). HttpRequestMessage имеет словарь Properties; вы обнаружите, что значение ключа MS_UserPrincipal содержит ваш объект IPrincipal.

При исследовании этого ответа я столкнулся с System.Web.Http.HttpRequestMessageExtensions, у которого есть метод расширения GetUserPrincipal(this HttpRequestMessage request), который обращается к этому значению словаря; Я не видел этот метод расширения до и напрямую обращался к Request.Properties["MS_UserPrincipal"], но это может быть лучший метод (менее зависимый от команды ASP.NET Web Api, сохраняющей имя ключа одинаковым...)

Ответ 3

Вы можете попытаться использовать этот метод расширения из System.ServiceModel.dll:

public static IPrincipal GetUserPrincipal(this HttpRequestMessage request);

как:

IPrincipal principal = request.GetUserPrincipal();
IIdentity identity = principal.Identity;

Ответ 4

У меня была та же проблема, и я нашел это. В вашем ApiController вы можете использовать base.ControllerContext.RequestContext.Principal.Identity.;