c# - 使用 HttpClient 的 .NET Core SPNEGO 身份验证

标签 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-Object System.Net.WebClient;
$client.UseDefaultCredentials = $true;
$client.DownloadString("http://10.2.0.9:50111/templeton/v1/status");

但是,当在与集群位于同一服务器上的 .NET Core 项目中运行以下内容时:

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,如 this issue 中所述。我应该能够将默认凭据传递到处理程序中,并且它会按预期工作。

我还尝试用 C# 编写在 PowerShell Core 中使用的相同代码,尽管代码相同,但仍然抛出相同的错误?

我可以提供的唯一其他详细信息是,Kerberos 连接到只有一个用户的 Active Directory 实例,并且所有这些请求都在使用 kinit 创建该用户的票证后运行。

最佳答案

我设法找到了解决办法。 With ASP.NET Core 2.1 they introduced a new SocketsHttpHandler默认情况下用于请求。这意味着在某些平台上它可能会覆盖我的请求中提供的 HttpHandler ,因此默认为您应该使用的套接字处理程序:

AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);

这解决了我的请求。

关于c# - 使用 HttpClient 的 .NET Core SPNEGO 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52266659/

相关文章:

c# - 如何在单击按钮时将数据从 View 发送到 Controller

hadoop - 如何找出用于 oozie 作业的映射器和缩减器的数量?

Java AD 组成员资格

c# - 在 EF 中使用基本类型列表

c# - 抑制关于 :blank in Print Output of WinForms WebBrowser

java - 映射器可以写入多个文件吗

c++ - 为什么 NetUserGetInfo 不给我用户主目录?

c# - DirectoryNotificationControl 未通知某些更改?

c# - 使用用户输入(int)作为多个功能的链接时避免崩溃的方法?

hadoop - Map-reduce oozie程序示例在CDH 4.5上不起作用