首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带HttpClient的.NET核心SPNEGO身份验证

带HttpClient的.NET核心SPNEGO身份验证
EN

Stack Overflow用户
提问于 2018-09-11 07:12:15
回答 1查看 2.3K关注 0票数 2

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

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

代码语言:javascript
复制
curl "http://10.2.0.9:50111/templeton/v1/status" --negotiate -k -u :

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

代码语言:javascript
复制
$client = New-Object System.Net.WebClient;
$client.UseDefaultCredentials = $true;
$client.DownloadString("http://10.2.0.9:50111/templeton/v1/status");

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

代码语言:javascript
复制
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));
            }
        }
    }

}

我得到以下错误:

代码语言:javascript
复制
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 Core2.1,因此正如在this issue中提到的,我应该能够将默认凭据传递到处理程序中,它将按预期工作。

我还尝试用C#编写与PowerShell核心相同的代码,尽管代码是相同的,但它仍然抛出相同的错误?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-11 08:17:07

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

代码语言:javascript
复制
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);

这解决了我的请求。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52266659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档