在 .NET Core 中的 Web 请求中使用 NTLM 身份验证

2024-04-06

Update事实证明,我所需要做的就是升级到 .NET Core 2.1!感谢大家的解决方案!


我有一个 .NET Core 2.0 控制台应用程序,需要向使用 Windows 身份验证(特别是 NTLM)的 API 发出 Web 请求。这是我公司的一个内部 API,我很难成功连接到它,不断收到 401 错误。

我的研究

我查看了SO:

  • Core 中的 NTLM 身份验证 HttpClient https://stackoverflow.com/questions/47822842/ntlm-authentication-httpclient-in-core- 去年提出,但没有给出正确的答案,表明该问题将在以后的 .NET Core 更新中得到解决。
  • 使用 HTTP Web 请求发送 HTTP 标头以进行 NTLM 身份验证 https://stackoverflow.com/questions/1520703/sending-http-headers-with-http-web-request-for-ntlm-authentication- 这是 2009 年的事情,似乎与 .NET Core 无关。
  • 如何让 HttpClient 将凭据与请求一起传递? https://stackoverflow.com/questions/12212116/how-to-get-httpclient-to-pass-credentials-along-with-the-request/12675503#12675503- 这是2012年的事,本以为会是那个,但使用时仍然得到401。

然后我发现这个问题是在 .NET Core github 中提出的,它说已经解决了 https://github.com/dotnet/corefx/issues/25988。我尝试以下那里有一个代码示例 https://github.com/dotnet/corefx/issues/25988#issuecomment-401129910但还是没用。

My code

这是我到目前为止所拥有的,我更改了 Uri,因为它托管在公司网络上,但我希望这足以在本地运行。

public class NTLMProxy
{
    private readonly HttpClient _httpClient;

    public NTLMProxy()
    {
        _httpClient = CreateHttpClientWithNTLM();
    }

    public Task<HttpResponseMessage> GetUsers()
    {
        var httpRequest = new HttpRequestMessage(HttpMethod.Get, _httpClient.BaseAddress);

        return _httpClient.SendAsync(httpRequest);
    }

    public HttpClient CreateHttpClientWithNTLM()
    {
        var uri = new Uri("http://ntlmservice.com/services/api/foo");
        var credentialsCache = new CredentialCache { { uri, "NTLM", CredentialCache.DefaultNetworkCredentials } };
        var handler = new HttpClientHandler { Credentials = credentialsCache };
        var httpClient = new HttpClient(handler) { BaseAddress = uri };
        httpClient.DefaultRequestHeaders.ConnectionClose = false;
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        ServicePointManager.FindServicePoint(uri).ConnectionLeaseTimeout = 120 * 1000;  // Close connection after two minutes

        return httpClient;
    }
}

如果您有任何想法/建议,请告诉我。


对于 .NET Core 2.1 我有这个实现工作,使用HttpClientFactory

In ConfigureServices(IServiceCollection services) in the class Startup我有这个名字HttpClient登记:

        services.AddHttpClient("myName").ConfigurePrimaryHttpMessageHandler(_ => new HttpClientHandler
        {
            Credentials = new CredentialCache { 
                {
                    new Uri("url"), "NTLM", new NetworkCredential("username", "password", "domain")
                }
            }
        });

在您需要的位置HttpClient像这样解决它:

var client  = _httpClientFactory.CreateClient("myName"); 

不要忘记在构造函数中注入工厂。

public class MyClass{
    private readonly IHttpClientFactory _httpClientFactory;

    public MyClass(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }
}

祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 .NET Core 中的 Web 请求中使用 NTLM 身份验证 的相关文章

随机推荐

  • 迭代包括空行在内的行

    给定一个带有一些空行的多行字符串 我如何在Lua中迭代行包括空行 local s foo nbar n njim for line in magiclines s do print line and blank or line end gt
  • Spark:创建嵌套架构

    伴随着火花 import spark implicits val data Seq 1 value11 value12 2 value21 value22 3 value31 value32 val df data toDF id v1 d
  • 使用 cURL 访问 API 可以正常工作,但使用 Fetch API 则不行 [重复]

    这个问题在这里已经有答案了 我知道这个问题已经得到解决lotSO 上的次数 但所有答案大多都是 向服务器添加某个标头 在这种情况下 API Shopify 工作得非常好 并且可以通过curl轻松访问 我已经使用 Axios 库和 Fetch
  • 如何动态刷新 .NET 数据绑定转发器控件

    我有一个 NET repeater控制即data bound到一个列表 作为中继器的一部分Item Collection 我有一个 删除按钮 可以有效地删除当前的列表元素 这有效 在代码隐藏中我可以成功地从datasource of the
  • 在React中,如何防止组件的CSS导入应用于整个应用程序?

    我在用着Facebook 的 create react 应用 https github com facebookincubator create react app对于我的应用程序 在我的 Login js 容器中 我像这样导入 CSS i
  • 使用 jquery 动态添加画布

    我已将所有代码包含在这个小提琴中 http jsfiddle net RymyY http jsfiddle net RymyY 我的问题涉及左侧的 添加形状 按钮 我希望每次单击第二个添加按钮时都能够添加一个新画布 但我无法让它工作 类似
  • OpenOffice pyno“全选”

    有谁知道如何使用 OO uno 桥接 api 在 Calc 工作表中 选择全部 或者 找到最大使用的行数和列数也可以 我想要做的是将格式应用于电子表格中的所有单元格 原因是我将工作表保存为 csv 因此除非格式提供足够的小数位 否则数字不会
  • 将 Expression> 通用拆箱为 Expression>

    正如标题中提到的 我有一个表达式 其中结果类型 存储 在object 这可以是all我的域类 有没有办法得到具体的表达方式 拆箱 如果我正确理解你的问题 你可能正在寻找的是表达式 转换 http msdn microsoft com en
  • Vue Native 始终执行 App.js 而不是 .vue

    我做了vue native安装的第一个过程 我正在遵循 入门 Hello world教程 https vue native io getting started html https vue native io getting starte
  • 根据文件的第二列对数据进行排序

    我有一个 2 列的文件n行数 第 1 列包含names和第2列age 我想根据以下内容按升序对该文件的内容进行排序age 在第二列 结果应该显示name最年轻的人以及name然后是第二年轻的人等等 关于单行 shell 或 bash 脚本的
  • 如何从 C++ 中加载和调用 VBScript 函数?

    我们的客户要求在我们的产品中发生特定操作时调用 VBScript 函数 我一直在尝试研究 Windows 脚本技术 但很难找到我真正需要的东西 希望你们中的一些人能够提供帮助 我们的产品是原生 C Windows 产品 客户将指定一个 VB
  • 将 sinon 模拟与 nodeunit 一起使用

    我正在学习使用 sinon 与nodeunit https github com caolan nodeunit 专门做嘲笑 这推荐方法 http sinonjs org nodeunit 是使用正节点单元 https github com
  • 如何提取html注释和节点包含的所有html?

    我正在创建一个小型网络应用程序来帮助我管理和分析网站内容 而 cURL 是我最喜欢的新玩具 我已经弄清楚如何提取有关各种元素的信息 如何查找具有特定类的所有元素等 但我遇到了两个问题 见下文 我希望有一些漂亮的 xpath 答案 但如果我必
  • 如何将字符串中的元音更改为符号?

    我需要使用 C 将字符串中的元音更改为 我知道我需要使用 for 循环 并且我很确定我走在正确的轨道上 但我无法让它工作 这是我的代码 include
  • 用于计算拉力赛速度图的数据[重复]

    这个问题在这里已经有答案了 我正在开发一个项目 从拉力赛中提取数据并创建速度图表 我了解要使用的 REST Web 服务 API 是缺陷 迭代 分层需求和迭代累积流数据 但是您能否告诉我如何进行实际计算来计算特定项目的每次迭代速度 需要什么
  • 使用 Clang AST 打印函数的参数

    我想将参数传递给函数 例如 如果我接到电话 printf d d i j 输出应该是 d dij 我可以使用 RecursiveASTVisitor 中的 VisitCallExpr 进行函数调用 还能够获取参数数量和参数类型 但我不知道如
  • 使用 jQuery ajax 响应数据

    我正在使用 ajax post 并接收 html 形式的数据 我需要拆分数据并将数据片段放置在整个页面上 我将响应数据构建为类似的 p Hello there and Welcome p p First timer visiting our
  • Uploadify 在 Chrome 10 中突然完全停止工作

    我正在使用 Uploadify 来允许在我的网络应用程序中上传多个文件 它始终适用于 IE 7 8 9 FF 3 6 Safari 和 Chrome 今天我偶然发现它在每个浏览器中都可以工作 但在 Chrome 中却不行 我目前使用的是 C
  • 是否可以隐藏弹性图表的轴并且使其不占用任何空间?

    是否可以告诉 flex 显示没有可见轴的图表 我希望图表的内容占据所有可用空间 我可以将 AxisRenderer 上的可见性设置为 false 这将隐藏轴 但会在轴通常所在的位置留下一个空白空间 我怎样才能删除这个空白区域
  • 在 .NET Core 中的 Web 请求中使用 NTLM 身份验证

    Update事实证明 我所需要做的就是升级到 NET Core 2 1 感谢大家的解决方案 我有一个 NET Core 2 0 控制台应用程序 需要向使用 Windows 身份验证 特别是 NTLM 的 API 发出 Web 请求 这是我公