.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是内部企业域名,需添加网络安全配置:
- 在
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> - 在
<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
相关产品推荐
相关产品推荐

