.NET 8 Blazor WASM登录Azure Entra后Query参数丢失问题求助
解决方案:.NET 8 Blazor WASM登录后保留Query参数
问题原因
.NET 8对Blazor WebAssembly的身份验证流程进行了调整,默认的MSAL登录跳转逻辑未正确保留原始请求的Query参数,导致登录成功后仅跳转至根路径。
具体解决步骤
1. 自定义登录跳转逻辑,携带完整URL
在Program.cs中修改MSAL配置,添加OnRedirectToLogin事件回调,手动保存包含Query参数的完整URL:
builder.Services.AddMsalAuthentication(options => { builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication); options.ProviderOptions.DefaultAccessTokenScopes .Add(builder.Configuration.GetValue<string>("DownstreamApi:Scopes")); options.ProviderOptions.LoginMode = "redirect"; // 拦截登录跳转,传递完整原始URL作为returnUrl options.Events.OnRedirectToLogin = context => { var fullOriginalUrl = context.NavigationManager.Uri; // 对URL进行编码,避免Query参数丢失 context.RedirectUri = $"authentication/login?returnUrl={Uri.EscapeDataString(fullOriginalUrl)}"; return Task.CompletedTask; }; });
2. 修改Authentication组件,登录成功后跳转至原始URL
找到项目中的Authentication.razor组件(通常在Pages目录下),添加登录成功后的导航处理逻辑:
@page "/authentication/{action}" @using Microsoft.AspNetCore.Components.WebAssembly.Authentication @using Microsoft.AspNetCore.WebUtilities <RemoteAuthenticatorView Action="@Action" OnLogInSucceeded="HandleLoginSuccess" /> @code { [Parameter] public string Action { get; set; } [Inject] public NavigationManager NavigationManager { get; set; } private void HandleLoginSuccess() { var currentUri = new Uri(NavigationManager.Uri); var queryParams = QueryHelpers.ParseQuery(currentUri.Query); // 解析保存的returnUrl参数 if (queryParams.TryGetValue("returnUrl", out var returnUrl) && !string.IsNullOrWhiteSpace(returnUrl)) { NavigationManager.NavigateTo(Uri.UnescapeDataString(returnUrl), forceLoad: true); return; } // 无returnUrl时跳转至默认首页 NavigationManager.NavigateTo("/", forceLoad: true); } }
3. 验证Azure Entra应用注册配置
确保Azure Entra应用注册的**回复URL(重定向URI)**包含你的应用域名(例如https://example.com/authentication/login-callback),并且未限制Query参数的传递。
验证效果
完成上述配置后,用户点击带Query参数的链接时:
- 会被重定向至Azure Entra登录页,同时完整URL被编码为
returnUrl参数 - 登录成功后,系统会解析
returnUrl并跳转至原始带参数的URL,正常展示指定客户资料
内容的提问来源于stack exchange,提问作者VSuser
相关产品推荐
相关产品推荐

