【问题标题】:Web API 2 Controller isn't picking up IPrincipal.User.Identity.NameWeb API 2 控制器没有选择 IPrincipal.User.Identity.Name
【发布时间】:2018-03-23 15:40:14
【问题描述】:

我正在为我的 Web API 2 设置权限,但我遇到了一个我已经研究了很长时间的问题。

当我在本地运行我的应用程序时,我无法使用IPrincipal.User 方法在我的ApiController 上获取当前用户名。我想要做的是在我的 AD 中搜索用户,然后过滤返回的组以确定用户是否有权访问不同网页的某些访问权限。

为了克服无法使用IPrincipal 类获取当前用户的问题,我使用了HttpContext.Current.Request.LogonUserIdentity.Name;。这可行,但我不明白为什么我不能使用 IPrincipal 类来实现同样的效果。

脚注:

我是否需要以某种方式配置我的 ApiController 以便用户从 IPrincipal 类返回?

在 Web.Config 文件中我设置了以下身份验证模式:

<authentication mode="Windows" />

【问题讨论】:

  • IPrincipal.User 是什么意思? IPrincipal 是一个接口,所以它没有任何属性。
  • @GabrielLuci 在我的 ApiController 中,如果我输入“用户”,它会给出一个我可以调用的方法列表,它说它是以下内容的一部分:System.Security.Principal.IPrincipal ApiController.User
  • @GabrielLuci 此外,我还看到了一些示例,如果您调用 User.Identity.Name 它会返回用户的当前名称,但在我的情况下它是空白的。

标签: .net api permissions active-directory


【解决方案1】:

如果用户未通过身份验证,Request.LogonUserIdentity 将显示运行 Web 服务器的用户。例如,在 IIS 中可能是 NT AUTHORITY\IUSR。在您的开发机器上,如果您正在运行 IIS Express,那可能是您的用户帐户。但是,如果用户通过了身份验证,那么这将更改为访问该站点的用户的凭据。

但是,Controller.User 属性只会显示用户的凭据。如果用户未通过身份验证,则为空白。

一旦用户通过身份验证,两者将是相同的。

(我现在刚刚测试了这个,这就是我看到的行为)

所以听起来用户没有经过身份验证。您是否仍然启用匿名身份验证?

【讨论】:

  • 感谢您的回复。所以当我使用HttpContext.Current.Request.LogonUserIdentity 时,我可以看到当前用户的凭据,包括域名。我还看到我在NT AUTHORITY 下运行。这也将 IsAnonymous 返回为 false。除了您的身份验证问题,我还在我的 Web.config 文件中设置了&lt;authentication mode="Windows" /&gt;。我还检查了当我运行“User.Identity.IsAnonymous”时它是否返回 true,我不知道为什么。我仍然坚持这个问题。
【解决方案2】:

所以我能够解决这个问题,并且通过使用以下网站得到了帮助:

https://spikesapps.wordpress.com/2016/09/08/how-to-implement-windows-authentication-in-an-angularjs-application-with-a-stand-alone-web-api/

基本上我必须从我的项目位置访问隐藏的 .vs 文件夹。在那里我去配置然后编辑applicationhost文件。然后我将以下内容应用于配置文件的末尾:

<location path="AccidentReporting.Web">
    <system.webServer>
        <security>
            <authentication>
                <anonymousAuthentication enabled="false" />
                <windowsAuthentication enabled="true" />
            </authentication>
        </security>
    </system.webServer>
</location>
<location path="AccidentReporting.API">
    <system.webServer>
        <security>
            <authentication>
                <anonymousAuthentication enabled="false" />
                <windowsAuthentication enabled="true" />
            </authentication>
        </security>
    </system.webServer>
</location>

您可以看到我已经正确添加了两次位置,这是因为在我的解决方案中我有两个项目,一个用于托管 API,另一个用于托管 WEB 应用程序。

所以现在在我的API Controller 中,我可以使用User.Identity.Name 方法访问用户身份名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-15
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    相关资源
    最近更新 更多