.NET MAUI App移动端HTTP API Basic认证失败,Windows端正常
解决MAUI移动端访问Dinstar API时的未授权问题
可能的原因及解决方案
1. 手动构造UTF-8编码的Basic认证头
Windows与Android平台的HttpClientHandler.Credentials对Basic认证的处理存在差异,尤其是当密码包含@这类特殊字符时。建议直接手动构造认证头,且使用UTF-8编码替代ASCII编码:
修改后的代码示例:
var username = "abcd"; var password = "abcd@123"; string statusMsg = ""; try { using (var handler = new HttpClientHandler()) { handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true; // 注释掉Credentials配置,改用手动构造认证头 // handler.Credentials = new NetworkCredential(username, password); var uri = $"http://mydinstarservice.dyndns.org:5050/api/send_ussd"; var jsonPayload = new { port = new int[] { 0 }, command = "send", text = "*222#" }; var jsonString = JsonSerializer.Serialize(jsonPayload); using (var client = new HttpClient(handler)) { // 用UTF-8编码生成Basic认证头 var credentials = $"{username}:{password}"; var byteArray = Encoding.UTF8.GetBytes(credentials); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); // 可选:设置与移动端浏览器一致的User-Agent,避免服务器拦截 client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Linux; Android 14; SM-G998B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36"); var content = new StringContent(jsonString, Encoding.UTF8, "application/json"); var response = await client.PostAsync(uri, content); // 调试用:打印响应状态和头信息,方便排查问题 statusMsg = $"状态码: {response.StatusCode}\n响应头: {string.Join("\n", response.Headers.Select(h => $"{h.Key}: {string.Join(", ", h.Value)}"))}"; if (response.IsSuccessStatusCode) { var result = await response.Content.ReadAsStringAsync(); statusMsg += $"\n返回结果: {result}"; } } } } catch (Exception ex) { statusMsg = $"错误信息: {ex.Message}"; }
2. 禁用自动重定向(若存在重定向场景)
部分服务器会返回重定向响应,Android平台的HttpClientHandler默认不会在重定向请求中携带认证头,导致后续请求触发未授权错误。可以禁用自动重定向:
handler.AllowAutoRedirect = false;
如果业务需要重定向,可在收到3xx响应后,手动构造新请求并携带认证头。
3. 验证认证头的正确性
用抓包工具(如Charles、Fiddler)抓取移动端请求,确认Authorization头格式是否正确。abcd:abcd@123用UTF-8编码后的正确Base64结果应为:
Authorization: Basic YWJjZDphYmNkQDEyMw==
4. 确认Android网络配置无遗漏
虽然已开启ClearTextTraffic,仍需确保配置文件正确且被引用:Resources/xml/network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">mydinstarservice.dyndns.org</domain> </domain-config> </network-security-config>
AndroidManifest.xml中需添加引用:
<application ... android:networkSecurityConfig="@xml/network_security_config">
关键说明
- VFP的
MSXML2.ServerXMLHTTP.6.0和浏览器的认证逻辑与MAUI Android的HttpClient存在差异,手动构造认证头能更精准控制请求格式。 - 密码中的特殊字符需确保编码正确,UTF-8是Basic认证的标准编码方式,部分服务器不兼容ASCII编码的认证头。
内容的提问来源于stack exchange,提问作者Rajesh
相关产品推荐
相关产品推荐

