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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:50:46