我能从 Web API 访问 IIdentity 吗?

49

我正在为一个现有的MVC应用程序添加一些Web API服务。我为我的MVC控制器编写了一个模型绑定器,以获取存储在CustomIdentity中的用户对象。我正在尝试将其复制到我的Web API操作中。

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

controllerContext.HttpContext.User.Identity

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

4个回答

72

但是在IsAuthorized方法中,如何访问控制器的属性之一——User? - Maverick
如果你指的是 AuthorizationAttribute.IsAuthorized 方法,你可以使用 principal.Identity - mhu
那么 principal 应该从哪里获取呢? - Maverick
请参阅 msdn:https://msdn.microsoft.com/zh-cn/library/system.componentmodel.dataannotations.authorizationattribute.isauthorized(v=vs.91).aspx - mhu

30

可以。 ApiController 有一个类型为 System.Net.Http.HttpRequestMessageRequest 属性;它自然地保存了当前请求的详细信息 (对于单元测试也有 setter)。 HttpRequestMessage 有一个 Properties 字典;你会发现键 MS_UserPrincipal 的值保存了你的 IPrincipal 对象。

在研究这个答案时,我发现了 System.Web.Http.HttpRequestMessageExtensions,它有一个 GetUserPrincipal(this HttpRequestMessage request) 扩展方法,用来访问这个字典值;我之前直接访问了 Request.Properties["MS_UserPrincipal"],但这可能是更好的方法(不再依赖于 ASP.NET Web Api 团队保持键名相同...)


谢谢!如果没有在对象浏览器中找到这个相当晦涩的扩展方法,我可能会浪费很多时间。 - Stephen M. Redd

4
您可以尝试使用System.ServiceModel.dll中的这个扩展方法:HttpRequestMessageExtensionMethods.cs
public static IPrincipal GetUserPrincipal(this HttpRequestMessage request);

作为:

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

2
我遇到了相同的问题,我找到了解决方法。 在您的ApiController中,您可以使用
base.ControllerContext.RequestContext.Principal.Identity.;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接