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

.NET MAUI 7 Android:OnReceivedHttpAuthRequest重写方法未触发

.NET MAUI WebView自动填充JS登录弹窗凭证问题

我在.NET MAUI应用中用WebView加载指定URL,访问网站时会弹出JS实现的简易登录弹窗。想通过代码自动填入登录凭证,于是重写了WebViewClient的OnReceivedHttpAuthRequest方法,通过handler.Proceed传入用户名和密码,但这个方法从未被触发。

我的实现类:

public class BasicAuthWebViewClient : WebViewClient
{
    private readonly string Username;
    private readonly string Password;

    public BasicAuthWebViewClient(string username, string password)
    {
        Username = username;
        Password = password;
    }

    public override void OnReceivedHttpAuthRequest(Android.Webkit.WebView view, HttpAuthHandler handler, string host, string realm)
    {
        handler.Proceed(Username, Password);
    }
}

构造方法调用:

androidWebView.SetWebViewClient(new BasicAuthWebViewClient(settings.Credentials.Username, settings.Credentials.Password)); 

问题原因

OnReceivedHttpAuthRequest方法只负责处理HTTP基础认证(Basic Auth)——也就是服务器返回401状态码时,浏览器自动弹出的系统级登录窗口。而你遇到的是网页通过JS渲染的自定义登录弹窗,属于网页DOM元素的一部分,和HTTP认证完全无关,所以这个方法根本不会被触发。

解决方案

要自动填充JS登录弹窗,核心思路是注入JavaScript代码操作网页DOM,在页面加载完成后自动填入账号密码并触发登录。

方案1:.NET MAUI跨平台实现

在WebView的Navigated事件中(确保页面已加载完成),调用EvaluateJavaScriptAsync执行注入脚本:

private async void WebView_Navigated(object sender, WebNavigatedEventArgs e)
{
    var webView = sender as WebView;
    if (webView == null) return;

    // 替换成目标网页实际的输入框ID和登录按钮ID
    var jsScript = @"
        document.getElementById('username').value = '" + settings.Credentials.Username + @"';
        document.getElementById('password').value = '" + settings.Credentials.Password + @"';
        document.getElementById('login-button').click();
    ";

    await webView.EvaluateJavaScriptAsync(jsScript);
}

方案2:Android原生平台定制

如果你需要基于Android原生WebView做处理,可以重写OnPageFinished方法,在页面加载完成后注入JS:

public class CustomWebViewClient : WebViewClient
{
    private readonly string _username;
    private readonly string _password;

    public CustomWebViewClient(string username, string password)
    {
        _username = username;
        _password = password;
    }

    public override void OnPageFinished(Android.Webkit.WebView view, string url)
    {
        base.OnPageFinished(view, url);
        
        // 替换为网页实际的元素选择器
        var jsInject = $"document.getElementById('username-input').value='{_username}'; " +
                       $"document.getElementById('password-input').value='{_password}'; " +
                       $"document.querySelector('.login-btn').click();";
        
        view.EvaluateJavascript(jsInject, null);
    }
}

然后设置给原生WebView:

androidWebView.SetWebViewClient(new CustomWebViewClient(settings.Credentials.Username, settings.Credentials.Password));

注意事项

  • 你需要先查看目标网站的HTML结构,确认用户名输入框、密码输入框和登录按钮的ID或选择器,替换代码中对应的部分。
  • 如果网站有动态渲染(比如React/Vue),可能需要等待元素加载完成后再执行JS,可以通过循环检测元素是否存在的方式处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:00:57