【问题标题】:Using Network Creds in dotnet core app on a mac using HttpClient使用 HttpClient 在 Mac 上的 dotnet 核心应用程序中使用网络凭据
【发布时间】:2019-12-10 16:30:22
【问题描述】:

编写 dotnet 核心应用程序。我需要使用网络凭据登录,因为服务(恰好是 TFS 本地服务器)使用这些凭据进行身份验证。在我(和另一个团队成员)的 Windows 机器上,以下代码有效:

Console.WriteLine("Type in your DOMAIN password:");
var pass = GetPassword(); //command line secure string magic from SO
var networkCredential = new NetworkCredential("USERNAME", pass, "DOMAINNAME");
string tfsDefaultCollection = "https://TFSURL/DefaultCollection";

string testUrl = $"{tfsDefaultCollection}/_apis/tfvc/changesets/1234/changes?api-version=2.2";

var httpClientHandler = new HttpClientHandler
{
    Credentials = networkCredential
};

var client = new HttpClient(httpClientHandler)
{
    BaseAddress = new Uri(testUrl)
};
httpClientHandler.PreAuthenticate = true;

var test = client.GetAsync(testUrl).Result;

Console.WriteLine(test);

但它在我的 mac 上不起作用。我收到未经授权的 401。两者都使用相同的硬接线连接。这适用于我的 Mac:

curl --ntlm --user "DOMAINNAME\USERNAME" "https://TFSURL/DefaultCollection/_apis/tfvc/changesets/1234/changes?api-version=2.2"

我认为这样就排除了连接性问题。我错过了我需要在我的 Mac 上做的事情吗?谁能指出一些文档或方法来解决这两个请求在最低级别所做的事情,看看是否有区别?

【问题讨论】:

标签: macos .net-core httpclient ntlm httpclienthandler


【解决方案1】:

好吧,最后一些 google-foo 让我到达了那里。用于 linux/mac 的 dotnet core 中有一个错误。此问题描述了修复:

https://github.com/dotnet/corefx/issues/25988#issuecomment-412534360

这与您连接的主机使用 Kerberos 和 NTLM 身份验证方法有关。

实现如下:

AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);

Console.WriteLine("Type in your DOMAIN password:");
var pass = GetPassword(); //command line secure string magic from SO
var networkCredential = new NetworkCredential("USERNAME", pass, "DOMAINNAME");
string tfsDefaultCollection = "https://TFSURL/DefaultCollection";

string testUrl = $"{tfsDefaultCollection}/_apis/tfvc/changesets/1234/changes?api-version=2.2";

var myCache = new CredentialCache
{
    {
        new Uri(testUrl), "NTLM",
        networkCredential
    }
};

var httpClientHandler = new HttpClientHandler
{
    Credentials = myCache
};

var client = new HttpClient(httpClientHandler)
{
    BaseAddress = new Uri(testUrl)
};
httpClientHandler.PreAuthenticate = true;

var test = client.GetAsync(testUrl).Result;

Console.WriteLine(test);

感谢 @dmcgill50 让我走上了正确的谷歌搜索轨道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 2018-04-16
    • 2020-11-23
    相关资源
    最近更新 更多