c# - 在 MacOS 上对来自 .NET Core 的 HttpClient 调用进行身份验证

标签 c# macos .net-core credentials dotnet-httpclient

我今天的问题是:
如何配置 HttpClient,以便它可以在不打扰 MacOS 上的用户的情况下对调用进行身份验证?
(.NET Core 2.2 控制台应用程序在 MacOS 上作为启动代理运行,通过我们公司的内部网络在启用了 NTLM 和 Kerberos 的 IIS 上调用 Web API)

长话短说:
我有一个 .NET Core 应用程序,它使用以下方法调用 Web api:

var handler = new HttpClientHandler() 
{ 
   UseDefaultCredentials = true 
};

var client = new HttpClient(handler)
{
   BaseAddress = new Uri("https://MyWebAPI.MyCompanyName.com/")
};

string result = client.GetAsync("MyEndpointSubURL")
    .Result.Content.ReadAsStringAsync().Result;

当我在 Windows 计算机上运行此程序时,该应用程序可以轻松连接并获取结果。
但是,当我在 Mac 上运行此程序时,出现异常:

Interop+NetSecurityNative+GssApiException - GSSAPI operation failed with error
The provided name was not a mechanism name. (unknown mech-code 0 for mech unknown).
at Microsoft.Win32.SafeHandles.SafeGssNameHandle.CreatePrincipal(String name)

我需要改变什么才能使其发挥作用吗?

我们非常希望避免提示打扰用户(它是一个后台同步服务)。

回想一下,它是一个在 MacOS 上作为 Launch Agent 运行的 .NET Core 2.2 控制台应用程序。它调用的 Web API 是由启用了 NTLM 和 Kerberos 的 IIS 托管的 Asp.NET Web API,我只需要通过 IIS(Web API 本身不使用任何身份验证/授权机制)。该API仅在我们公司的内部网络上公开,因此用户已经登录到网络。

最佳答案

尝试运行 kinit <username>@<DOMAIN>从终端,然后再次运行您的程序。您可能需要配置您的krb5.conf文件正确指向域 Controller 。

我们在带有 .NET Core 2.1+ 的 Mac 系统中使用“默认凭据”,使用您在此处显示的相同代码。通过kinit配置Kerberos而conf文件是最大的挑战。

据我所知,.NET 不使用运行 kinit 产生的缓存。 ,但这就是配置要使用的主体的内容。 .NET 与 Kerberos 的交互记录很少。请参阅https://github.com/dotnet/corefx/issues/30203#issuecomment-395592407

关于c# - 在 MacOS 上对来自 .NET Core 的 HttpClient 调用进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54161826/

相关文章:

c# - ASP.NET Core 中的持久内存并发字典

c# - 如何按类实例的属性值对包含类对象的数组进行排序?

c# - 线程中抛出的未处理的异常不会被捕获

c# - ASP.NET MVC 绑定(bind)十进制值

mysql - Sequel Pro/MAMP 在哪里存储本地数据库?

c# - xUnit - 在测试中提取和实现接口(interface)

c# - 有什么工具可以帮助我将方法调用从使用基于位置的参数重构为基于名称的参数

ios - Alamofire 上的事件监听器

swift - macOS - 使用 NSImageView 以编程方式显示图像

c# - 核心 3.1 - 绑定(bind) Body 中的一些属性和 Header 中的其他一些属性