当前位置: 首页 > 知识库问答 >
问题:

带有NTLM身份验证的C#HttpClient未传递正确的凭据

郎翔
2023-03-14

有两个ASP.NET核心API,其中API A具有基本身份验证,API B具有windows身份验证。API A正在调用API B,但由于API B启用了windows身份验证,因此API A需要具有NTLM身份验证的httpclient

API A(简体):

var ccahe = new CredentialCache
{
    {
        httpRequestMessage.RequestUri, "NTLM",
        new NetworkCredential("a.antr01", "pw", "ICEPOR")
    }
};
var httpClientHandler = new HttpClientHandler()
{
    PreAuthenticate = true,
    Credentials = ccahe,
    UseDefaultCredentials = true,
    AllowAutoRedirect =  true
};

using (HttpClient httpClient = new HttpClient(httpClientHandler))
{
    return await httpClient.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseHeadersRead);
}

正如您在上面的代码片段中所看到的,我有一个HttpClient,其用户为a.antr01,但在API B中的调试器中,在声明转换代码中,我看到了my用户,该用户登录在Windows中,并在该帐户下运行IDE:

如何将支持NTLM的API A的请求发送到API B,并且API B将具有正确的凭据?

编辑:如果有一种html" target="_blank">方法可以在API B中同时支持basic和NTLM身份验证,那么API a就不再需要了,也许有人知道如何实现?

因此,基本身份验证流程将为解码Base64->针对AD进行身份验证->获取授权声明->继续到控制器

NTLM身份验证将为(已通过身份验证)->获取授权声明->继续到控制器

共有2个答案

云联
2023-03-14

我可以为你的编辑提供解决方案。在WebAPI中同时实现windows和基本身份验证的唯一方法是使用特定位置进行基本身份验证:web.config

<configuration>
    <system.web>
        <authentication mode="Windows" />
    </system.web>


  <location path="api/mypath">
    <system.webServer>
      <security>
        <authentication>
          <basicAuthentication defaultLogonDomain="mydomain" enabled="true" realm="myrealm" />
        </authentication>
      </security>
    </system.webServer>
  </location>

</configuration>

因此对/API/MyPath/MyController的所有请求都需要基本身份验证。所有其他请求/API/SomeOtherPath/SomeOtherController将使用windows身份验证。

您可以将控制器与[system.web.http.route(“API/MyPath/MyController”)]重新匹配

在IIS服务器中,so应同时启用Windows身份验证和基本身份验证。之后,web.config就会启动(您可能还必须配置IIS配置文件以启用这两种身份验证类型)。

如果您不坚持在同一个端点上使用NTLM和basic->,这可能是您的解决方案。

除此之外,我使用几乎完全相同的代码连接到带有NTLM的API:

var credentialsCache = new CredentialCache
{{builder.Uri, "NTLM", new NetworkCredential(
    "user",
    "password",
    "domain"
)}};
var handler = new HttpClientHandler { Credentials = credentialsCache };
var client = new HttpClient(handler);
await client.PostAsync(url, data).ConfigureAwait(false);
郑俊彦
2023-03-14

为了理智起见,你能用仅仅

var httpRequestMessage = ...; // whatever it's expecting

var httpClientHandler = new HttpClientHandler()
{
    PreAuthenticate = true,
    Credentials = new NetworkCredential("a.antr01", "pw", "ICEPOR"), // real password instead of "pw"
    AllowAutoRedirect =  true
};

using (HttpClient httpClient = new HttpClient(httpClientHandler))
{
    return await httpClient.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseHeadersRead);
}

看看API B中发生了什么?

 类似资料:
  • 问题内容: 我正在尝试使用kerberos / HTTP主机进行身份验证。使用Apache HttpClient作为我的客户端- 以及此源的略微修改版本。 我的Kerberos身份验证非常顺利,我希望知道如何以编程方式设置登录凭据。目前,凭据是通过控制台手动输入的,但是我想在运行时选择它。[实际上,正如我希望对大量用户进行自动化和负载测试的服务器。]。 编辑:这是相关部分的代码片段: 该接口有两种

  • 我试图在一个反应式Spring Boot应用程序中配置一个Spring Security性,该应用程序具有一个Vuejs前端,在未经身份验证时将用户重定向到外部OpenID提供程序(用于身份验证)。在用户通过OpenID提供程序进行身份验证并重定向回应用程序(前端)后,将根据OpenID提供程序的响应创建用户名密码身份验证令牌(身份验证),并手动进行身份验证。 但是,在执行此操作时,应用程序似乎无

  • 问题内容: 尝试使用JavaMail中的NTLM连接到Exchange服务器。我可以连接到SMTP,但不能连接到IMAP。我还可以使用相同的主机/用户名/密码通过OS X Mail.app应用程序进行身份验证,帐户类型=“ IMAP”,端口143,ssl = false,authentication = NTLM,域名=“。 连接代码: 输出: 我尝试通过http://www.oracle.com

  • 问题内容: 我正在使用Spring 3 Web应用程序,因为Spring 3不支持NTLM身份验证,可以与Spring安全性一起使用的其他替代方法有哪些?这样,当用户登录到Active Directory时就可以通过应用程序进行身份验证了吗? 目前,Kerberos解决方案不是一个选择,NTLM是唯一的选择。 任何帮助都是非常明显的。 谢谢 问题答案: 我已经做过一次了。在这里抓住它。它将需要在A

  • 我相对来说是JMeter的新手,但是我很难让HTTP Sampler登陆到一个安全的网页上。我认为它需要NTLM认证,所以我使用HTTP授权管理器来传递BlazeMeter指南中指定的凭证 我的授权管理器具有以下值: 基本网址: https:// [测试站点] 用户名: [我的用户名] 密码: [我的密码] 域:与基本网址相同 机制: BASIC_DIGEST 然而,我只是得到一个401错误(见下

  • 我对社交网络分析和twitter api是新手。我想收集关于特定主题的tweets。所以我写了下面的代码 在我的程序中,我需要在哪里提供凭据 谢谢