Blazor WebAssembly应用AccessTokenNotAvailableException问题求助
解决Blazor WebAssembly登录跳转及AccessTokenNotAvailableException问题
一、强制全局或页面级授权校验
要实现用户首次访问直接跳转登录,需确保应用触发授权校验:
- 单个页面添加授权:给需要登录的页面类加上
[Authorize]特性[Authorize] public partial class Index { // 页面逻辑 } - 全局强制授权:在
Program.cs中配置默认策略,所有未单独配置的页面都要求登录builder.Services.AddAuthorization(options => { options.FallbackPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); });
二、修复RedirectToLogin组件跳转逻辑
原组件未传递返回Url,且跳转方式可能不规范,修改为:
@inject NavigationManager Navigation protected override void OnInitialized() { // 携带当前页面地址作为登录后的返回路径 var returnUrl = Uri.EscapeDataString(Navigation.Uri); Navigation.NavigateTo($"authentication/login?returnUrl={returnUrl}", forceLoad: true); }
也可通过令牌提供者触发标准跳转(需引入Microsoft.AspNetCore.Components.WebAssembly.Authentication命名空间):
@inject NavigationManager Navigation @inject IAccessTokenProvider TokenProvider protected override async Task OnInitializedAsync() { var tokenResult = await TokenProvider.RequestAccessToken(); if (!tokenResult.TryGetToken(out _) && tokenResult.RequiresRedirect) { Navigation.NavigateTo(tokenResult.RedirectUrl); } }
三、捕获API调用时的AccessTokenNotAvailableException
在API调用代码中直接处理异常,触发登录跳转:
@inject HttpClient HttpClient private async Task LoadAppData() { try { var data = await HttpClient.GetFromJsonAsync<YourDataType>("api/yourdata"); // 数据处理逻辑 } catch (AccessTokenNotAvailableException ex) { // 自动跳转登录,登录后返回当前页面 ex.Redirect(); } }
四、验证Program.cs身份验证配置
确保OIDC或其他身份验证服务配置正确,以OIDC为例:
builder.Services.AddOidcAuthentication(options => { builder.Configuration.Bind("Oidc", options.ProviderOptions); options.ProviderOptions.ResponseType = "code"; options.ProviderOptions.ClientId = "你的客户端ID"; options.ProviderOptions.Authority = "你的身份提供商地址"; });
五、确认App.razor路由配置正确性
保证AuthorizeRouteView逻辑正常:
<Router AppAssembly="@typeof(App).Assembly"> <Found Context="routeData"> <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"> <NotAuthorized> @if (!context.User.Identity?.IsAuthenticated ?? true) { <RedirectToLogin /> } else { <p role="alert">你无权访问此资源。</p> } </NotAuthorized> <Authorizing> <p>加载中...</p> </Authorizing> </AuthorizeRouteView> </Found> <NotFound> <LayoutView Layout="@typeof(MainLayout)"> <p role="alert">抱歉,该地址不存在。</p> </LayoutView> </NotFound> </Router>
内容的提问来源于stack exchange,提问作者Prv
相关产品推荐
相关产品推荐

