Ответ 1
Они удалили GetUserPrincipal в ASP.NET MVC 4 RC. Однако кажется, что свойство ApiController Пользователь заменило это: http://msdn.microsoft.com/en-us/library/system.web.http.apicontroller.user
Я добавляю некоторые службы веб-API к существующему приложению MVC. У меня есть модельное связующее для моих MVC-контроллеров, чтобы получить пользовательский объект, хранящийся в CustomIdentity. Я пытаюсь воспроизвести это для моих действий веб-API.
В MVC Controller или его связующих я могу использовать
controllerContext.HttpContext.User.Identity
ApiController не имеет объекта HttpContext. Есть ли вообще доступ к объекту IIdentity из веб-API?
Они удалили GetUserPrincipal в ASP.NET MVC 4 RC. Однако кажется, что свойство ApiController Пользователь заменило это: http://msdn.microsoft.com/en-us/library/system.web.http.apicontroller.user
Да, вы можете. 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, сохраняющей имя ключа одинаковым...)
Вы можете попытаться использовать этот метод расширения из System.ServiceModel.dll:
public static IPrincipal GetUserPrincipal(this HttpRequestMessage request);
как:
IPrincipal principal = request.GetUserPrincipal();
IIdentity identity = principal.Identity;
У меня была та же проблема, и я нашел это.
В вашем ApiController вы можете использовать
base.ControllerContext.RequestContext.Principal.Identity.;