我正在测试我自己的 Web API 服务,并且在添加之后
[Authorize(Roles = "MyRole")]
对于 Controller ,HttpClient 发出的所有请求都失败并显示“未授权”(401)。服务托管在启用了 Windows 身份验证的 IIS Express 中,如建议的那样 here .
客户端发送合适的请求头:
var authHeaderParameter = Convert.ToBase64String(Encoding.ASCII.GetBytes("MyUser:MyPassword"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authHeaderParameter);
从浏览器发出的相同请求(至少,相同的 URI 和凭据)按预期工作并返回数据。 Fiddler 显示,浏览器发送“Proxy-Authorization”请求 header ,但不发送任何“Authorization”。
我做错了什么? 如何使用 HttpClient 修复请求?
UPD。
这也没有帮助:
var handler = new HttpClientHandler
{
UseProxy = false
};
var client = new HttpClient(handler, true)
{
BaseAddress = new Uri(baseAddress)
};
请您参考如下方法:
好吧,问题出在 IIS Express 设置中。
我会发布这个答案并将“VS 2015”标签添加到问题中,因为它可能会有帮助。
感谢@swiley,WireShark和 npcap (最后需要通过 WireShark 捕获环回接口(interface)流量)。
检查发送到网络浏览器的响应 header ,我发现 401 响应包含 Autorization: NTLM标题。由于浏览器会自动处理这种情况,因此它会在进一步的请求中发送当前的 NTLM 凭据并获取请求的数据。我的HttpClient代码不会,实际上也不能处理 NTLM .
先决条件。
首先,这是 VS 2015,我的 Web API 项目使用 IIS Express 进行托管,这是默认设置。这里的非默认是我已经将端口更改为常量值:
其次,VS 2015 中的 IIS express 将其配置存储在 %SolutionDir%\.vs\config\applicationhost.config 中文件。请注意,这与以前的版本不同。
第三个。 按 F4 键可用的项目属性非常有限,事实上,您只是在修改相同的 applicationhost.config。从上面:
第四,this帖子没有帮助:
To enable Basic authentication using IIS, set the authentication mode to "Windows" in the Web.config of your ASP.NET project:
虽然这将适用于“成熟的”IIS,但 Visual Studio + IIS express 会忽略这些设置。
解决方案。
- 打开
%SolutionDir%\.vs\config\applicationhost.config在文本编辑器中。 - 首先找到
<authentication>标签。 - 在它下面,找到
<basicAuthentication enabled="false" />, 并更改enabled至true. - 保存文件。
- 重新启动 Web 应用程序。
请注意,您可以通过按 F4 查看的属性存储在 <location path="YourProjectName"> 下标签。
默认情况下,它有子标签authentication , 但没有 basicAuthentication :
<authentication>
<windowsAuthentication enabled="false" />
<anonymousAuthentication enabled="false" />
</authentication>
如果解决方案有多个具有自定义身份验证设置的 IIS Express 托管项目,则应添加 basicAuthentication进入项目相关部分而不是第一个 <authentication>标记,这是每个解决方案的全局配置。
