Blazor 9注册或登录时抛出NavigationException异常
原因分析与修复方案
1. 修复IdentityRedirectManager的空URI与异常捕获
异常触发点在IdentityRedirectManager.RedirectTo方法,通常是因为跳转URI为空或客户端路由无法处理。找到项目中的IdentityRedirectManager.cs文件,修改方法逻辑:
public void RedirectTo(string? uri) { // 处理空URI情况,默认跳转首页 var targetUri = string.IsNullOrEmpty(uri) ? "/" : uri; try { // 强制重载页面,适配WASM模式下的服务器端跳转 _navigationManager.NavigateTo(targetUri, forceLoad: true); } catch (NavigationException) { // 捕获异常后 fallback 到首页 _navigationManager.NavigateTo("/", forceLoad: true); } }
2. 确保登录/注册的跳转地址非空
检查登录、注册组件的逻辑,确保成功后的跳转地址有默认值。比如在Login.razor.cs中:
private async Task HandleValidSubmit() { var result = await SignInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false); if (result.Succeeded) { // 显式设置默认跳转地址,避免ReturnUrl为空 var returnUrl = ReturnUrl ?? "/"; NavigationManager.NavigateTo(returnUrl, forceLoad: true); } // 错误处理逻辑... }
注册组件同理,确保注册成功后的跳转地址不为空。
3. 配置WASM模式下的身份验证服务
在Program.cs中确认身份验证服务配置正确,适配Blazor WASM的特性:
builder.Services.AddAuthentication(options => { options.DefaultScheme = IdentityConstants.ApplicationScheme; options.DefaultSignInScheme = IdentityConstants.ExternalScheme; }) .AddIdentityCookies(); // 添加WASM专用的身份验证状态提供器 builder.Services.AddScoped<AuthenticationStateProvider, PersistingRevalidatingAuthenticationStateProvider>();
4. 启用日志定位深层问题
如果以上方案未解决,在appsettings.json中开启详细日志,查看跳转URI的具体值:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore.Components.Navigation": "Debug", "Microsoft.AspNetCore.Identity": "Debug" } } }
通过日志可以确认是否存在URI格式错误、路由未注册等问题。
内容的提问来源于stack exchange,提问作者MikeT
相关产品推荐
相关产品推荐

