在服务器端使用 NTLM 检查 url

Check url with NTLM on server side

我需要检查 url 是否存在并且可以访问。为此,我发送 Get 请求并处理状态:

var httpClient = new HttpClient();
var response = httpClient.GetAsync(new Uri(pageUrl));
isPageAccessible = response.Result.StatusCode == HttpStatusCode.OK;

但是,服务器使用 NTLM 进行身份验证。正如我发现的 ,在我获得成功 OK 状态之前有几个步骤(请求)。对于第一个请求,我得到 401 Unauthorized 状态并且无法进行进一步的步骤。

总而言之,如何在完成所有请求后使用 NTML 在服务器上检查 url?

您正在为失败做好准备,因为请求可能 return 没有 200 OK 响应的原因有很多。一种可能是响应没有内容204 No Content。另一种可能是请求只接受 POSTPUT 请求。另一个,正如您所发现的,可能是它前面有一个身份验证系统 401 Not Authorized。另一个可能只是响应是重定向 301 Moved Permanently302 Found。或者它可能位于代理 305306 等之后

确定 URL 是否真的存在的唯一方法是要求另一端证明它。 Google 这样做,Facebook 这样做,Pinterest 这样做,等等。他们这样做的方式是要求发件人在他们的 DNS 中设置 MX 记录,或者在他们的 index.html 上使用自定义元标记他们生成的令牌。如果令牌存在,那么他们就是他们所说的人。

其他都不靠谱

如果您正在访问经过身份验证的服务器,您应该提供凭据。 运行 NTLM 进程的凭据可以通过 HttpClient 提供,如下所示:

var handler = new HttpClientHandler { 
                      Credentials = System.Net.CredentialCache.DefaultCredentials
                  };
var httpClient = new HttpClient(handler);
var response = httpClient.GetAsync(new Uri(pageUrl));