gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:55:58 24 4
gpt4 key购买 nike

我正在测试我自己的 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,WireSharknpcap (最后需要通过 WireShark 捕获环回接口(interface)流量)。

检查发送到网络浏览器的响应 header ,我发现 401 响应包含 Autorization: NTLM标题。由于浏览器会自动处理这种情况,因此它会在进一步的请求中发送当前的 NTLM 凭据并获取请求的数据。我的HttpClient代码不会,实际上也不能处理 NTLM .

先决条件。

首先,这是 VS 2015,我的 Web API 项目使用 IIS Express 进行托管,这是默认设置。这里的非默认是我已经将端口更改为常量值:

enter image description here

其次,VS 2015 中的 IIS express 将其配置存储在 %SolutionDir%\.vs\config\applicationhost.config 中文件。请注意,这与以前的版本不同。

第三个。按 F4 键可用的项目属性非常有限,事实上,您只是在修改相同的 applicationhost.config。从上面:

enter image description here

第四,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" /> , 并更改 enabledtrue .
  4. 保存文件。
  5. 重新启动 Web 应用程序。

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

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

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

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

关于c# - 针对 Web API 的 HttpClient 基本身份验证失败,而浏览器按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33652266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com