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

Posted

技术标签:

【中文标题】在 .NET Core 的 Web 请求中使用 NTLM 身份验证【英文标题】:Use NTLM Authentication in Web Request in .NET Core 【发布时间】:2019-05-11 00:19:50 【问题描述】:

更新 原来我需要做的就是升级到 .NET Core 2.1!感谢大家的解决方案!


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

我的研究

我查看了 SO:

NTLM authentication HttpClient in Core - 去年提出,没有给出正确答案,表示该问题将在以后的 .NET Core 更新中得到解决。 Sending HTTP Headers with HTTP Web Request for NTLM Authentication - 这是在 2009 年,似乎与 .NET Core 无关。 How to get HttpClient to pass credentials along with the request? - 这是 2012 年的,以为是那个,但在使用时仍然得到 401。

然后我在 .NET Core github 中发现了这个问题,上面写着 it has been resolved。我试过关注a code example there,但还是不行。

我的代码

这是我目前所拥有的,我更改了 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 而不是 2.0?甚至您的链接示例也表明它适用于 .NET 2.1。 我意识到,在我发布问题后(呜呜呜),现在更新 Visual Studio 并将使用 .Net Core 2.1 进行尝试,并将更新进度。 NTLM 和 Windows 身份验证是一回事吗?这对我来说适用于 Windows 身份验证 HttpClient = new HttpClient(new HttpClientHandler UseDefaultCredentials = true)。我没有 CredentialsCache 的东西,不确定代码是否在后台做同样的事情。 @GeorgiGeorgiev 人们使用两者来表示 Windows 身份验证 @Trozza 长期支持版本是 2.1,而不是 2.0。 2.0 已经不受支持。无论如何,您都应该迁移到 2.1 【参考方案1】:

对于 .NET Core 2.1,我使用 HttpClientFactory 实现了此实现工作

ConfigureServices(IServiceCollection services)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;
    

祝你好运!

【讨论】:

以上是关于在 .NET Core 的 Web 请求中使用 NTLM 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core Web API 在 API GET 请求中检索空白记录

如何在 ASP.NET Core MVC 中请求和显示实时 Web api 数据?

[ASP.NET Core Web应用上使用个人用户帐户存储在应用程序中的Postman模拟登录时出现400错误请求错误

ASP.NET Core 6框架揭秘实例演示[32]:错误页面的N种呈现方式

在 Angular 9 + Asp.net Core Web API 中启用 Windows 身份验证后,预检(选项)请求失败

如何使用 Angular 取消 .Net Core Web API 请求?