【问题标题】:Can I access IIdentity from Web API我可以从 Web API 访问 IIdentity
【发布时间】:2012-04-03 20:40:55
【问题描述】:

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

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

controllerContext.HttpContext.User.Identity

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 但是如何在IsAuthorized 方法中访问用户(控制器的属性)?
    • 如果你的意思是AuthorizationAttribute.IsAuthorized方法,你可以使用principal.Identity
    • ...从哪里得到principal
    【解决方案2】:

    是的,你可以。 ApiController 有一个 Request 类型为 System.Net.Http.HttpRequestMessage 的属性;这自然包含有关当前请求的详细信息(它还有一个用于单元测试目的的设置器)。 HttpRequestMessage 有一个 Properties 字典;您会发现键 MS_UserPrincipal 的值包含您的 IPrincipal 对象。

    在研究这个答案时,我遇到了System.Web.Http.HttpRequestMessageExtensions,它有一个GetUserPrincipal(this HttpRequestMessage request) 扩展方法,可以访问这个字典值;我之前没见过这种扩展方法,直接访问Request.Properties["MS_UserPrincipal"],但这可能是更好的方法(较少依赖于 ASP.NET Web Api 团队保持密钥名称相同...)

    【讨论】:

    • 谢谢!我可能会浪费很多时间在对象浏览器中寻找这种相当晦涩的扩展方法。
    【解决方案3】:

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

    public static IPrincipal GetUserPrincipal(this HttpRequestMessage request);
    

    作为:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-19
        • 1970-01-01
        • 2018-11-16
        相关资源
        最近更新 更多