C# 使用HttpClient进行.NET核心SPNEGO身份验证

C# 使用HttpClient进行.NET核心SPNEGO身份验证,c#,hadoop,active-directory,ldap,kerberos,C#,Hadoop,Active Directory,Ldap,Kerberos,我目前正在编写一个简单的基于.NET Core的客户端,用于通过WebHCat与Hadoop集群交互,我正在尝试找出如何使用SPNEGO进行身份验证,就像在curl或Powershell Core中一样 使用Curl,我可以查询WebHCat的状态端点,如下所示: curl "http://10.2.0.9:50111/templeton/v1/status" --negotiate -k -u : 同样的请求也可以在Powershell Core中执行: $client = New-Obje

我目前正在编写一个简单的基于.NET Core的客户端,用于通过WebHCat与Hadoop集群交互,我正在尝试找出如何使用SPNEGO进行身份验证,就像在curl或Powershell Core中一样

使用Curl,我可以查询WebHCat的状态端点,如下所示:

curl "http://10.2.0.9:50111/templeton/v1/status" --negotiate -k -u :
同样的请求也可以在Powershell Core中执行:

$client = New-Object System.Net.WebClient;
$client.UseDefaultCredentials = $true;
$client.DownloadString("http://10.2.0.9:50111/templeton/v1/status");
但是,在与群集位于同一服务器上的.NET核心项目中运行以下各项时:

using System;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace testauth
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var host = "http://10.2.0.9:50111/templeton/v1/status";
            var handler = new HttpClientHandler
            {
                UseDefaultCredentials = true,
                AllowAutoRedirect = true,
            };
            using (var client = new HttpClient(new LoggingHandler(handler)))
            {
                var res = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, host));
            }
        }
    }

}
我得到以下错误:

Unhandled Exception: System.ComponentModel.Win32Exception: GSSAPI operation failed with error - An invalid status code was supplied (Server not found in Kerberos database).
   at System.Net.NTAuthentication.GetOutgoingBlob(Byte[] incomingBlob, Boolean throwOnError, SecurityStatusPal& statusCode)
客户端正在运行.NET Core 2.1,因此正如我在中提到的,我应该能够将默认凭据传递到处理程序中,它将按预期工作

我也尝试过用C#编写与我在PowerShell Core中使用的代码相同的代码,尽管代码相同,它仍然抛出相同的错误

我能提供的唯一其他详细信息是,Kerberos仅与一个用户连接到Active Directory实例,并且所有这些请求都是在使用
kinit

创建该用户的票证后运行的,我设法找到了修复方法。默认情况下用于请求。这意味着在某些平台上,它可能会覆盖我的请求中提供的
HttpHandler
,因此默认为您应该使用的套接字处理程序:

AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
这解决了我的要求