gpt4 book ai didi

c# - HTTPClient 在成功之前获得两个 401(发送错误的 token )

转载 作者:可可西里 更新时间:2023-11-01 07:45:09 24 4
gpt4 key购买 nike

我正在尝试使用 HttpClient 与自托管 WebAPI 客户端通信。使用以下代码创建客户端:

HttpClientHandler clientHandler = new HttpClientHandler()
{
UseDefaultCredentials = true,
PreAuthenticate = true
};
var client = new HttpClient(clientHandler);

在服务器端我们设置:

HttpListener listener = (HttpListener)app.Properties[typeof(HttpListener).FullName];
listener.AuthenticationSchemes = AuthenticationSchemes.IntegratedWindowsAuthentication;

Startup 文件中。

问题是在处理请求之前,我收到两个(或预身份验证后的一个)401 错误。

在 fiddler 中,序列如下所示:

First request:
Authorization: Negotiate TlRMTVNTUAABAAAAl7II4gcABwAxAAAACQAJACgAAAAGAbEdAAAAD1dTMTEzLTEyMFNXVC0xMTM=
Answer:
WWW-Authenticate: Negotiate TlRMTVNTUAACAAAADgAOADgAAAAVwonisrQOBMTKHhKwCkgCAAAAAJoAmgBGAAAABgGxHQAAAA9TAFcAVAAtADEAMQAzAAIADgBTAFcAVAAtADEAMQAzAAEAEgBXAFMAMQAxADMALQAxADIAMAAEABYAcwB3AHQALQAxADEAMwAuAGwAbwBjAAMAKgBXAFMAMQAxADMALQAxADIAMAAuAHMAdwB0AC0AMQAxADMALgBsAG8AYwAFABYAQQBMAEQASQA5ADkAOQAuAGwAbwBjAAcACACkGh0XVY3QAQAAAAA=

Second request (succeeds):
Authorization: Negotiate TlRMTVNTUAADAAAAAAAAAFgAAAAAAAAAWAAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAAAAAAABYAAAAFcKI4gYBsR0AAAAPfJafWSuLL0sAXYtWCynOqg==

那么为什么我的客户不是第一次发送正确的授权 token 而是总是需要这种两次方法?

最佳答案

您遇到的是正常现象,这就是 NTLM 身份验证方案的工作原理。

1: C  --> S   GET ...

2: C <-- S 401 Unauthorized
WWW-Authenticate: NTLM

3: C --> S GET ...
Authorization: NTLM <base64-encoded type-1-message>

4: C <-- S 401 Unauthorized
WWW-Authenticate: NTLM <base64-encoded type-2-message>

5: C --> S GET ...
Authorization: NTLM <base64-encoded type-3-message>

6: C <-- S 200 Ok
  1. 客户端向服务器发送一个GET请求。
  2. 由于您需要通过身份验证才能访问所请求的资源,服务器会发回一个 401 Unathorized 响应,并在 WWW-Authenticate header 中通知客户端它支持NTLM 身份验证。所以这是您获得第一个 401 响应代码的地方。
  3. 客户端在Authorization header 中将域名和用户名发送到服务器。请注意,仅基于这些信息还无法对客户端进行身份验证。
  4. 服务器向客户端发送质询。这是一个随机生成的数字,称为 nonce。这是您获得第二个 401 响应代码的地方。
  5. 客户端发回对服务器质询的响应,使用其密码的散列来加密随机数。
  6. 服务器将客户端的用户名、发送给客户端的质询以及从客户端收到的响应发送给域 Controller 。使用用户名,域 Controller 检索用户密码的哈希值并用它加密质询。如果结果与客户端发送的响应匹配,则客户端通过身份验证,服务器向客户端返回一个200响应代码和请求的资源。

关于c# - HTTPClient 在成功之前获得两个 401(发送错误的 token ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30209509/

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