我今天的问题是:
如何配置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)
有什么想法需要改变才能使其生效?
我们迫切希望避免打扰用户(提示是作为后台同步服务)。
回想一下,它是一个.NET Core 2.2控制台应用程序,在MacOS上作为启动代理运行。它所调用的Web API是一个由IIS托管且启用了NTLM和Kerberos的Asp.NET Web API,我只需要通过IIS(Web API本身不使用任何身份验证/授权机制)。该API仅在我们公司的内部网络上公开,因此用户已经登录到该网络。
答案 0 :(得分:1)
我很难使它在带有.NET Core 2.2的macOS上运行。
我遵循online documentation来设置您的krb5.conf
,运行kinit
和klist
以确保我有一张有效的kerberos票。
毕竟,kerberos正在使用Azure Data Studio,所以我知道我的设置可以,但是HttpClient
不能正常工作。它总是失败,并显示相同的错误:
UseDefaultCredentials = true
但是它确实在同事的机器上工作。
经过大量挖掘,我们发现我的同事安装了.NET Core 2.2.7,而我只有2.2.1。将工作站升级到.NET Core 2.2.8解决了我的问题。同样回滚我们的应用程序以使用2.1.13也可以。
我希望这对以后的人有所帮助。
答案 1 :(得分:0)
尝试一下: 带有基本身份验证示例。
var url = "https://MyWebAPI.MyCompanyName.com/";
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "Base64Credetials");
using (var response = await httpClient.GetAsync(url))
if (response.IsSuccessStatusCode)
{
var strResponse = await response.Content.ReadAsStringAsync();
MyObject result = JsonConvert.DeserializeObject<MyObject>(strResponse);
if (result != null)
{
//Your code here
}
}
}
答案 2 :(得分:0)
我不认为MacOS具有与Windows相同的“默认身份验证”概念。 Kerberos和NTLM都是Windows的概念。我怀疑在MacOS上,您将不得不使用其他身份验证方案(基本身份验证或承载身份验证),然后从诸如钥匙串之类的位置检索凭据。 IIRC应用程序可以被授予对密钥链的静默读取访问权限。
答案 3 :(得分:0)
尝试从终端运行kinit <username>@<DOMAIN>
,然后再次运行程序。您可能需要配置krb5.conf
文件以正确指向域控制器。
在Mac上使用.NET Core 2.1+的Mac上,我们使用与此处显示的相同的代码来运行“默认凭据”。通过kinit
和conf文件配置Kerberos是最大的挑战。
根据我的判断,.NET不会使用运行kinit
所产生的缓存,但这是配置要使用的主体的内容。 .NET与Kerberos的交互记录很少。参见https://github.com/dotnet/corefx/issues/30203#issuecomment-395592407