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

Net6 Blazor WASM基于Azure Entra登录后动态重定向需求

实现Blazor WASM + Azure Entra登录后动态重定向到目标页面

核心思路

不需要在Azure Entra中硬编码所有页面的重定向URI,只需配置一个通用的认证回调路径,由Blazor应用在登录流程中保存用户最初访问的页面路径,认证完成后再跳转到该路径。

步骤1:配置Azure Entra应用注册

  • 进入Azure Portal的Entra ID应用注册,找到你的应用
  • 切换到「认证」页面,添加SPA类型的重定向URI,值设为你的应用根地址加上/authentication/login-callback(例如https://my-website.azurewebsites.net/authentication/login-callback)
  • 保存配置

步骤2:配置Blazor WASM认证服务

在Program.cs中配置MSAL认证,确保启用路径保存逻辑:

builder.Services.AddMsalAuthentication(options =>
{
    // 绑定Azure Entra配置(来自appsettings.json)
    builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
    // 添加所需的API权限范围
    options.ProviderOptions.DefaultAccessTokenScopes.Add("https://graph.microsoft.com/User.Read");
    
    // 配置认证路径
    options.AuthenticationPaths.LoginPath = "/authentication/login";
    options.AuthenticationPaths.LoginCallbackPath = "/authentication/login-callback";
    options.AuthenticationPaths.LogoutCallbackPath = "/authentication/logout-callback";
    
    // 设置通用重定向URI,对应Entra中配置的回调地址
    options.ProviderOptions.RedirectUri = "authentication/login-callback";
});

步骤3:自定义登录回调页面(可选,若默认行为不满足)

创建或修改LoginCallback.razor页面,处理认证完成后的动态重定向:

@page "/authentication/login-callback"
@inject NavigationManager NavigationManager
@inject IAuthenticationService AuthenticationService

@code {
    protected override async Task OnInitializedAsync()
    {
        var authResult = await AuthenticationService.AuthenticateAsync();
        
        if (authResult.Succeeded)
        {
            // 获取登录前的目标路径(从URL的returnUrl参数中读取)
            var returnUrl = NavigationManager.QueryString("returnUrl") ?? "/";
            // 跳转到原始目标页面
            NavigationManager.NavigateTo(returnUrl, forceLoad: true);
        }
        else
        {
            // 认证失败时跳转到错误页
            NavigationManager.NavigateTo("/authentication/login-failed");
        }
    }
}

步骤4:全局路由授权与跳转逻辑

在App.razor中使用AuthorizeRouteView保护所有路由,当用户未认证时,自动携带当前路径跳转到登录页:

<Router AppAssembly="@typeof(App).Assembly">
    <Found Context="routeData">
        <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
            <NotAuthorized>
                @{
                    // 获取当前页面的相对路径作为returnUrl
                    var returnUrl = NavigationManager.ToBaseRelativePath(NavigationManager.Uri);
                    // 跳转登录页并携带编码后的returnUrl
                    NavigationManager.NavigateTo($"authentication/login?returnUrl={Uri.EscapeDataString(returnUrl)}", forceLoad: true);
                }
            </NotAuthorized>
        </AuthorizeRouteView>
    </Found>
    <NotFound>
        <LayoutView Layout="@typeof(MainLayout)">
            <p>抱歉,该地址不存在。</p>
        </LayoutView>
    </NotFound>
</Router>

关键说明

  • 所有需要授权的页面会在用户未登录时自动跳转到登录页,并携带当前页面路径作为returnUrl参数
  • Azure Entra只需配置一个通用的回调地址,无需硬编码所有页面
  • returnUrl使用Uri.EscapeDataString编码,避免特殊字符导致的路径解析错误

内容的提问来源于stack exchange,提问作者R_100

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:43:21