Skip to main content
 首页 » 编程设计

c#之针对 Web API 的 HttpClient 基本身份验证失败,而浏览器按预期工作

2024年01月31日33oomusou

我正在测试我自己的 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 会忽略这些设置。

解决方案。

  1. 打开%SolutionDir%\.vs\config\applicationhost.config在文本编辑器中。
  2. 首先找到 <authentication>标签。
  3. 在它下面,找到<basicAuthentication enabled="false" /> , 并更改 enabled至 true .
  4. 保存文件。
  5. 重新启动 Web 应用程序。

请注意,您可以通过按 F4 查看的属性存储在 <location path="YourProjectName"> 下标签。

默认情况下,它有子标签authentication , 但没有 basicAuthentication :

<authentication> 
    <windowsAuthentication enabled="false" /> 
    <anonymousAuthentication enabled="false" /> 
</authentication> 

如果解决方案有多个具有自定义身份验证设置的 IIS Express 托管项目,则应添加 basicAuthentication进入项目相关部分而不是第一个 <authentication>标记,这是每个解决方案的全局配置。