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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:46:17