You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI安卓端调用IIS NTLM认证API报401未授权

解决.NET MAUI Android端RestSharp连接NTLM认证API的401问题

你的问题核心是Android端没有完成NTLM认证的二次质询请求,这不是Android与NTLM不兼容,而是需要针对性配置才能让RestSharp/HttpClient正确处理NTLM的协商流程。以下是具体排查和解决步骤:

1. 配置RestSharp的NTLM认证处理器

RestSharp默认不会自动触发NTLM的二次请求,需要显式指定NtlmAuthenticator并配置HttpClientHandler:

// 构建带NTLM凭证的HttpClientHandler
var handler = new HttpClientHandler
{
    Credentials = new NetworkCredential("你的用户名", "你的密码", "Windows域名"),
    AllowAutoRedirect = true,
    // 禁用预认证,让客户端等待服务器的质询后再发送凭证
    PreAuthenticate = false
};

// 配置RestClient选项
var clientOptions = new RestClientOptions("你的API基础地址")
{
    ConfigureMessageHandler = () => handler,
    // 启用NTLM认证器
    Authenticator = new NtlmAuthenticator("你的用户名", "你的密码", "Windows域名")
};

// 初始化RestClient
var restClient = new RestClient(clientOptions);

2. 检查AndroidManifest.xml的网络配置

Android 9+对明文流量和网络访问有严格限制,必须确保以下配置:

  • 添加上网权限:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
  • 如果API使用HTTP协议,在<application>标签中允许明文流量:
    <application ... android:usesCleartextTraffic="true">
    
  • 若API是内部企业域名,需添加网络安全配置:
    1. 在Resources/xml目录创建network_security_config.xml:
      <?xml version="1.0" encoding="utf-8"?>
      <network-security-config>
          <domain-config cleartextTrafficPermitted="true">
              <domain includeSubdomains="true">你的API域名</domain>
          </domain-config>
      </network-security-config>
      
    2. 在<application>标签中引用该配置:
      <application ... android:networkSecurityConfig="@xml/network_security_config">
      

3. 强制使用System.Net.Http.ClientHandler(可选)

.NET MAUI在Android上默认使用AndroidClientHandler,部分场景下可能对NTLM支持不佳,可强制切换为系统HttpClientHandler:
在Android项目的.csproj文件中添加:

<PropertyGroup>
    <AndroidHttpClientHandlerType>System.Net.Http.HttpClientHandler</AndroidHttpClientHandlerType>
</PropertyGroup>

4. 检查IIS的NTLM配置

确保IIS站点仅启用NTLM认证(而非同时启用Negotiate),因为Negotiate会优先尝试Kerberos,而Android端Kerberos配置复杂易失败:

  • 打开IIS管理器,找到目标站点 → 身份认证
  • 禁用「协商」,仅保留「Windows身份认证」(即NTLM)

5. 验证凭证格式

确保传入的NetworkCredential参数正确:

  • 域名必须是Windows域的NetBIOS名或完整域名,不能省略
  • 用户名不要带域名前缀(比如直接用user而非domain\user,因为NetworkCredential的Domain参数已单独设置)

完成以上配置后,Android端应该能正确响应服务器的NTLM质询,发送二次请求完成认证。

内容的提问来源于stack exchange,提问作者JR Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:37:14