我正在为我的 Web API 2 设置权限,但遇到了一个我已经研究了一段时间的问题。
当我在本地运行应用程序时,我无法使用
ApiController
方法获取 IPrincipal.User
上的当前用户名。我想要做的是在我的 AD 中搜索用户,然后过滤返回的组以确定用户是否有权访问不同网页的某些访问权限。
为了克服无法使用
IPrincipal
类获取当前用户的问题,我使用了 HttpContext.Current.Request.LogonUserIdentity.Name;
。这可行,但我不明白为什么我不能使用 IPrincipal
类来实现相同的输出。
脚注:
我是否需要以某种方式配置我的 ApiController 以便用户从
IPrincipal
类返回?
在Web.Config文件中我设置了以下身份验证模式:
<authentication mode="Windows" />
Request.LogonUserIdentity
将向您显示 Web 服务器正在运行的用户。例如,在 IIS 中可能是 NT AUTHORITY\IUSR
。在您的开发计算机上,如果您正在运行 IIS Express,则这可能是您的用户帐户。但是,如果用户经过身份验证,则该凭据将更改为访问该站点的用户的凭据。
Controller.User
属性只会显示用户的凭据。如果用户未经过身份验证,则为空。
用户通过身份验证后,两者将是相同的。
(我现在刚刚测试了这个,这就是我看到的行为)
所以听起来用户没有经过身份验证。您还启用匿名身份验证吗?
所以我能够解决这个问题,并且通过使用以下网站得到了帮助:
基本上我必须从我的项目位置访问隐藏的 .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
方法访问用户身份名称。