.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
相关产品推荐
相关产品推荐

