我今天的问题是:
如何配置 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/