我可以从 Web API 访问 IIdentity 吗?

本文关键字:IIdentity 访问 API Web 我可以 | 更新日期: 2023-09-27 18:28:25

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

在 MVC 控制器或其粘合剂中,我可以使用

controllerContext.HttpContext.User.Identity

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

我可以从 Web API 访问 IIdentity 吗?

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

是的,你可以。 ApiController具有类型 System.Net.Http.HttpRequestMessageRequest属性;这自然地保存了有关当前请求的详细信息(它还具有用于单元测试目的的 setter(。 HttpRequestMessage有一本Properties字典;您将找到保存IPrincipal对象的键的值MS_UserPrincipal

在研究这个答案时,我遇到了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;

我遇到了同样的问题,我找到了这种方式。在您的 API 控制器中,您可以使用
base.ControllerContext.RequestContext.Principal.Identity.;