我可以从Web API访问IIdentity吗?

我将一些Web API服务添加到现有的MVC应用程序中。 我有我的MVC控制器模型联编程序来获取用户对象存储在一个CustomIdentity。 我试图重现这个我的Web API操作。

在MVC控制器或其绑定我可以使用

controllerContext.HttpContext.User.Identity 

ApiController没有HttpContext对象。 有没有办法从Web API访问IIdentity对象?

他们删除了ASP.NET MVC 4 RC中的GetUserPrincipal。 但是,似乎ApiController属性用户已经取代了这个: http : //msdn.microsoft.com/en-us/library/system.web.http.apicontroller.user

是的你可以。 ApiController有一个System.Net.Http.HttpRequestMessagetypes的Request属性; 这自然保存了关于当前请求的细节(它也有一个用于unit testing的setter)。 HttpRequestMessage有一个Properties字典; 你会发现MS_UserPrincipal键的值包含你的IPrincipal对象。

在研究这个答案时,我遇到了System.Web.Http.HttpRequestMessageExtensions ,它有一个访问这个字典值的GetUserPrincipal(this HttpRequestMessage request)扩展方法; 我之前没有看到过这个扩展方法,并直接访问Request.Properties["MS_UserPrincipal"] ,但这可能是一个更好的方法(更less依赖于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.;