【问题标题】:How to obtain a JWT token in Blazor code using OpenID Connect如何使用 OpenID Connect 在 Blazor 代码中获取 JWT 令牌
【发布时间】:2021-12-20 22:02:41
【问题描述】:

使用 Windows 身份平台作为授权创建默认 Blazor 服务器(不是 webassembly)应用程序(我使用过 VS2022 / .net 6)。

是否可以在 blazor 组件(例如 LoginDisplay)的代码部分中获取 JWT 令牌?

例如 - 我可以从身份验证状态中获取声明,如下所示(对于我在 LoginDisplay.razor 中的示例)

@code
{
    [CascadingParameter] private Task<AuthenticationState> authenticationStateTask { get; set; }

    protected override async Task OnInitializedAsync()
    {
        var authState = await authenticationStateTask;
        var user = authState.User;
        var identity = user.Identity as ClaimsIdentity;
        if (identity != null)
        {
            IEnumerable<Claim> claims = identity.Claims;
            
            // Can I get the a JWT Token signed by Azure B2C here?

        }
    }
}

我还可以从 Azure 服务获取 JWT 令牌吗(我不想重新生成自己的 - 我想要一个由微软签名的原始令牌)。

作为澄清 - 在不同的项目(用于单页应用程序)上使用 MSAL javascript 库时,我可以调用诸如 MSAL.acquireTokenSilent 来从 Azure B2C 服务获取令牌。

更新 - 如果 HttpContext.GetTokenAsync 返回 null

另外enets在下面回答。如果您发现无法使用 HttpContext.GetTokenAsync 访问 JWT 令牌,请查看此question

【问题讨论】:

    标签: jwt blazor azure-ad-b2c openid-connect blazor-server-side


    【解决方案1】:

    您可以访问access tokenrefresh token,如下所述,前提是您已将应用设置为使用 Jwt 令牌身份验证 (OpenID Connect)。请参阅this answer 如何做到这一点。注意:同一用户还有与该问题相关的第二个答案。搜索它。 This answer 也很有用。请参阅this answer,其中包含指向有用答案的链接。注意:你可以谷歌搜索这样的字符串:“enet stackoverflow blazor jwt token”,比如我自己找答案。如果您想查看有关AuthenticationStateProvider 的答案,只需搜索“enet stackoverflow blazor AuthenticationStateProvider”

    获取访问令牌

    在 _Host.cshtml 中,您可以编写如下代码:

    @using Microsoft.AspNetCore.Authentication
    
    @{
        var tokens = new InitialApplicationState
        {
            AccessToken = await HttpContext.GetTokenAsync("access_token"),
            RefreshToken = await HttpContext.GetTokenAsync("refresh_token")
        };
    }
    

    然后将令牌对象传递给您的 Blazor 应用,如下所示:

    <component type="typeof(App)" render-mode="ServerPrerendered" param- 
                                               InitialState="tokens"/>
    

    请注意,tokens 对象作为参数传递给 App 组件,如下所示:

    @code{
    
        [Parameter]
        public InitialApplicationState InitialState { get; set; }
    
        protected override Task OnInitializedAsync()
        {
            TokenProvider.AccessToken = InitialState.AccessToken;
            TokenProvider.RefreshToken = InitialState.RefreshToken;
    
            return base.OnInitializedAsync();
        }
    }
    

    注意:TokenProvider 是一个单例服务实例,它保存 JWT 令牌,并使其可用于您应用的其他部分。您可以将 JWT 令牌保存在本地存储中或更好的会话存储中并在需要时读取它们等。

    注意:如果您不使用 Web Api,则不需要 Jwt 令牌(身份验证)。使用 Microsoft 身份验证

    【讨论】:

    • 感谢@enet 添加代码。今天下午帮我设置了一个项目。
    • [礼貌]不客气;}
    • 我想我很接近 - 只是 GetTokenAsync 调用返回 null。从链接看来,这是因为我需要执行 SaveTokens = true 但是...默认的 blazor 项目在 program.cs // 将服务添加到容器中执行此操作。 builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));而且似乎没有地方可以设置配置 - 我需要从 OpenIdConnectDefaults.AuthenticationScheme 更改它吗?
    • 啊哈-我在 vs 2022 中的默认 .net 核心 Web 应用程序项目 .net 遇到了同样的问题。即我的问题不是 blazor,而是我如何使用(新的?) AddMicrosoftIdentityWebApp 方法(SaveTokens 不能单独工作 - 我需要其他东西)。 @enet - 这意味着你的答案是正确的,就像如何将令牌放到 blazor 代码中一样。我将首先单独研究如何获取令牌并相应地更新我的问题,以便对其他人来说是一个有用的“开箱即用”问题。
    【解决方案2】:

    引用 MS:

    Blazor 服务器应用的内置 AuthenticationStateProvider 服务从 ASP.NET Core 的 HttpContext.User 获取身份验证状态数据。这就是身份验证状态与现有 ASP.NET Core 身份验证机制集成的方式。

    Jwt 令牌作为bearer 在那里。

    要获取标题,@enet 在此处提供了一个问题/答案,它向您展示了如何从 Blazor 服务器应用程序访问 HttpRequest。 - How to use the HttpContext object in server-side Blazor to retrieve information about the user, user agent.

    我没有一个方便的项目,它有 JWT 令牌来为你整理一些代码。其他人可能能够使用代码添加另一个答案或添加一些代码。

    【讨论】:

    • @enet 在您放置的链接上的回答可能是对 blazor 服务器端应用程序的 HTTPContext 的整体可用性的最佳解释之一。我一直在玩获取 _hosts.cshtml 中的上下文,但不喜欢掌握实际的 JWT。我将阅读并报告,这是一个很好的指针。
    • @Jonny,我之前看到过你的问题,但目前我在 stackoverflow 中并不活跃。你的补充让我回答了你的问题。谢谢...
    猜你喜欢
    • 2015-06-27
    • 2015-02-05
    • 2017-06-28
    • 2023-02-24
    • 2017-06-21
    • 2020-03-18
    • 2017-09-26
    • 2019-06-27
    相关资源
    最近更新 更多