带有HttpClient的.NET Core SPNEGO Auth [英] .NET Core SPNEGO Auth with HttpClient

查看:114
本文介绍了带有HttpClient的.NET Core SPNEGO Auth的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm currently writing up a simple .NET Core based client for interacting with Hadoop Clusters via WebHCat and I'm trying to figure out how to authenticate with the SPNEGO as you would in something like curl or Powershell Core.

使用Curl,我可以像这样查询WebHCat的状态端点:

Using Curl I am able to query the status endpoint of WebHCat like so:

curl "http://10.2.0.9:50111/templeton/v1/status" --negotiate -k -u :

相同的请求也可以在Powershell Core中执行:

The same request can also executed in Powershell Core:

$client = New-Object System.Net.WebClient;
$client.UseDefaultCredentials = $true;
$client.DownloadString("http://10.2.0.9:50111/templeton/v1/status");

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

However when it comes to running the following in a .NET Core project sitting on the same server as the cluster:

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

The client is running .NET Core 2.1 so as was mentioned in this issue I should just be able to pass default credentials into the handler and it would work as expected.

我还尝试编写与C#中PowerShell Core中使用的代码相同的代码,尽管代码相同,但仍会引发相同的错误?

I have also tried writing the same code that I used in PowerShell Core in C# and despite the code being identical it still throws the same error?

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

The only other details I can give is that the Kerberos is connected to an Active Directory instance with only one user and all these requests are run after the ticket for that user have been created with kinit.

推荐答案

我设法找到了解决方法. 使用ASP.NET在Core 2.1中,他们引入了一个新的SocketsHttpHandler ,默认情况下用于请求.这意味着在某些平台上,它可能会覆盖我的请求中提供的HttpHandler,因此默认使用您应该使用的套接字处理程序:

I managed to find a fix. With ASP.NET Core 2.1 they introduced a new SocketsHttpHandler which is used by default for requests. This means that on some platforms it may override the HttpHandler provided in my request and so to default to the sockets handler you should use:

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

这解决了我的要求.

这篇关于带有HttpClient的.NET Core SPNEGO Auth的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆