我创建了一个仅在公司网络上使用的Web Api 2应用程序。我已经阅读了Web API中的Windows身份验证,所以它似乎是可能的。但我需要弄清楚这个的正确实现。我在我的Web.config中包含了以下xml:
<system.web>
<authentication mode="Windows" />
</system.web>
我似乎记得在旧学校webforms应用程序中的某种类型的事件钩子。类似于BeginRequest()的东西,可以在渲染页面之前进行安全检查。我将以下代码行包含在我的一个控制器方法的第一行中,但返回的值似乎只是一个没有任何有意义信息的空对象:
var identity = HttpContext.Current.User.Identity as WindowsIdentity;
Web API 2是否支持Windows身份验证?我错过了一步吗?如果我提交Postman的一般请求进行测试,Windows身份验证是否有效?我也试过这段代码,但得到了一个类似的空对象:
var x = RequestContext.Principal;
我模糊地回忆起像“启用集成安全性”这样的IIS设置。你能说明确切的设置吗?如果我在IIS Express上运行应用程序,我是否能够完成此任务?
更新
我按照下面其中一个答案中提到的IIS Express的步骤进行了操作,但我在原始帖子中提供的代码示例仍未获得填充的用户对象。我还更新了applicationhost.config文件以关闭匿名身份验证:
<anonymousAuthentication enabled="false" userName="" />
我做了更新后,我通过Postman重新提交了我的测试请求,但是我收到以下错误:
<h3>HTTP Error 401.2 - Unauthorized</h3>
<h4>You are not authorized to view this page due to invalid authentication headers.</h4>
</div>
<div class="content-container">
<fieldset>
<h4>Most likely causes:</h4>
<ul>
<li>No authentication protocol (including anonymous) is selected in IIS.</li>
<li>Only integrated authentication is enabled, and a client browser was used that does not support integrated authentication.</li>
<li>Integrated authentication is enabled and the request was sent through a proxy that changed the authentication headers before they reach the Web server.</li>
<li>The Web server is not configured for anonymous access and a required authorization header was not received.</li>
<li>The "configuration/system.webServer/authorization" configuration section may be explicitly denying the user access.</li>
</ul>
</fieldset>
</div>
<div class="content-container">
<fieldset>
<h4>Things you can try:</h4>
<ul>
<li>Verify the authentication setting for the resource and then try requesting the resource using that authentication method.</li>
<li>Verify that the client browser supports Integrated authentication.</li>
<li>Verify that the request is not going through a proxy when Integrated authentication is used.</li>
<li>Verify that the user is not explicitly denied access in the "configuration/system.webServer/authorization" configuration section.</li>
<li>Check the failed request tracing logs for additional information about this error. For more information, click
<a href="http://go.microsoft.com/fwlink/?LinkID=66439">here</a>.
</li>
</ul>
</fieldset>
</div>
我是否需要使用某种类型的特殊标头配置我的Postman请求才能使其正常工作?
答案 0 :(得分:4)
如果您使用的是 IIS Express ,则需要更新applicationhost.config
文件。
这是IIS配置工具的文件版本,您可以在其中配置Web服务器本身。您可以在以下目录中找到此文件:
%userprofile%\documents\iisexpress\config\applicationhost.config
或
%userprofile%\my documents\iisexpress\config\applicationhost.config
找到后,请将其更新为:
<windowsAuthentication enabled="true">
<providers>
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
对于IIS:
选中此项以获取更多details
答案 1 :(得分:1)
使用本地域用户且适用于Intranet站点的Windows身份验证。
示例:
我使用固定路径路径实现了TestAuthentication
方法/操作。对于演示,我还没有包含授权属性。该代码检查User
的{{1}}属性。其中包含与ApiController
或Thread.CurrentPrincipal
相同的数据。确保禁用IIS中的匿名身份验证,否则HttpContext.Current.User
将为空。
Identity.Name
在Web.config文件中:
public class WinAuthController : ApiController
{
[HttpGet]
[Route("api/testauthentication")]
public IHttpActionResult TestAutentication()
{
Debug.Write("AuthenticationType:" + User.Identity.AuthenticationType);
Debug.Write("IsAuthenticated:" + User.Identity.IsAuthenticated);
Debug.Write("Name:" + User.Identity.Name);
if (User.Identity.IsAuthenticated)
{
return Ok("Authenticated: " + User.Identity.Name);
}
else
{
return BadRequest("Not authenticated");
}
}
}
在IE中,您可以使用工具&gt;检查设置。互联网选项&gt;高级并查找设置启用Windows集成身份验证。当您转到Security选项卡,然后转到Intranet和Custom Level时,您会在底部找到一个设置,指定IE是自动登录还是提示输入用户名和密码。
请访问以下链接,它具有WEP API Windows身份验证的正确步骤:
答案 2 :(得分:1)
下面是在Web api中为本地和服务器(IIS)配置Windows身份验证的步骤。
1)对于本地:
a)要在Windows身份验证模式下创建Web api项目,请执行以下步骤:
选择 ASP.Net Web应用程序后,选择 Web API模板,然后从右侧单击更改身份验证按钮,然后选择 Windows身份验证。
b)对于现有的Web api项目,只需在您的applicationhost.config
文件中添加以下几行即可。
<location path="YourProjectName">
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="false" />
<windowsAuthentication enabled="true" />
</authentication>
</security>
</system.webServer>
</location>
2)对于服务器(IIS)
要在IIS中托管应用程序后运行Windows身份验证,只需在节点内的web.config
文件中添加以下行:
<authentication mode="Windows" />
<authorization>
<allow verbs="OPTIONS" users="?" />
<deny users="?" />
</authorization>
在两种情况下,只需在您的代码中使用以下行即可证明Windows身份验证正常工作:
if(User.Identity.IsAuthenticated)
{
//do work
}
答案 3 :(得分:1)
除了先前的答案外,我们还需要在跨域请求中传递凭据。
服务器端(Web API):
在true
属性上将 SupportsCredentials 属性设置为[EnableCors]
:
[EnableCors(origins: "http://exampleclient.com", headers: "*",
methods: "*", SupportsCredentials = true)]
客户端(UI):
将 XMLHttpRequest.withCredentials 设置为true
。
jQuery:
$.ajax({
type: 'get',
url: 'http://www.example.com/api/auth',
xhrFields: {
withCredentials: true
}
角度:
this.http.get('http://www.example.com/api/auth', { withCredentials: true }).subscribe((resp: any) => {
console.log(resp)
}
XMLHttpRequest:
var xhr = new XMLHttpRequest();
xhr.open('get', 'http://www.example.com/api/auth');
xhr.withCredentials = true;