我可以从Web API访问IIdentity吗?

时间:2012-03-19 10:54:47

标签: c# asp.net-web-api

我正在向现有的MVC应用程序添加一些Web API服务。我有一个模型绑定器,用于我的MVC控制器,以获取存储在CustomIdentity中的用户对象。我正在尝试为我的Web API操作重现这一点。

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

controllerContext.HttpContext.User.Identity

ApiController没有HttpContext对象。无论如何都要从Web API访问IIdentity对象吗?

4 个答案:

答案 0 :(得分:72)

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

答案 1 :(得分:30)

是的,你可以。 ApiController的{​​{1}}属性类型为Request;这自然地保存了当前请求的详细信息(它还有一个用于单元测试目的的setter)。 System.Net.Http.HttpRequestMessage有一个HttpRequestMessage字典;您会发现密钥Properties的值包含您的MS_UserPrincipal对象。

在研究这个答案时,我遇到了IPrincipal,它有一个System.Web.Http.HttpRequestMessageExtensions扩展方法来访问这个字典值;我之前没有看过这个扩展方法并直接访问GetUserPrincipal(this HttpRequestMessage request),但这可能是一个更好的方法(更少依赖于ASP.NET Web Api团队保持密钥的名称相同......)< / p>

答案 2 :(得分:4)

您可以尝试使用System.ServiceModel.dll中的extension method

public static IPrincipal GetUserPrincipal(this HttpRequestMessage request);

为:

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

答案 3 :(得分:2)

我有同样的问题,我发现了这种方式。 在你的ApiController中你可以使用
base.ControllerContext.RequestContext.Principal.Identity.;