我正在向现有的MVC应用程序添加一些Web API服务。我有一个模型绑定器,用于我的MVC控制器,以获取存储在CustomIdentity中的用户对象。我正在尝试为我的Web API操作重现这一点。
在MVC控制器或其绑定器中,我可以使用
controllerContext.HttpContext.User.Identity
ApiController没有HttpContext对象。无论如何都要从Web API访问IIdentity对象吗?
答案 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.;