在MacOS上验证来自.NET Core的HttpClient调用的身份

时间:2019-01-12 16:57:05

标签: 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)

有什么想法需要改变才能使其生效?

我们迫切希望避免打扰用户(提示是作为后台同步服务)。

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

4 个答案:

答案 0 :(得分:1)

我很难使它在带有.NET Core 2.2的macOS上运行。

我遵循online documentation来设置您的krb5.conf,运行kinitklist以确保我有一张有效的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