如何使用 OpenID Connect 在 Blazor 代码中获取 JWT 令牌
How to obtain a JWT token in Blazor code using OpenID Connect
使用 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 returns null
另外 enets 在下面回答。如果您发现无法使用 HttpContext.GetTokenAsync 访问 JWT 令牌,请参阅此 question
引用MS:
Blazor 服务器应用程序的 built-in AuthenticationStateProvider 服务从 ASP.NET Core 的 HttpContext.User 获取身份验证状态数据。这就是身份验证状态与现有 ASP.NET 核心身份验证机制集成的方式。
Jwt 令牌在那里 bearer
。
要获得 header,@enet 在此处提供了 Question/Answer,向您展示了如何从 Blazor 服务器应用程序访问 HttpRequest。 - How to use the HttpContext object in server-side Blazor to retrieve information about the user, user agent.
我没有一个方便的项目可以为您编写一些代码的 JWT 令牌。其他人可能能够使用代码添加另一个答案或添加一些代码。
您可以访问 access token
和 refresh token
,如下所述,前提是您已将应用设置为使用 Jwt 令牌身份验证 (OpenID Connect)。请参阅 how to do that. Note: There is also a second answer related to that question by the same user. Search for it. can also be useful. See ,其中包含指向有用答案的链接。注意:您可以 Google 搜索字符串,例如:“enet Whosebug blazor jwt token”,诸如此类由我来寻找答案。如果您想查看有关 AuthenticationStateProvider
的答案,只需搜索“enet Whosebug 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 身份验证
使用 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 returns null
另外 enets 在下面回答。如果您发现无法使用 HttpContext.GetTokenAsync 访问 JWT 令牌,请参阅此 question
引用MS:
Blazor 服务器应用程序的 built-in AuthenticationStateProvider 服务从 ASP.NET Core 的 HttpContext.User 获取身份验证状态数据。这就是身份验证状态与现有 ASP.NET 核心身份验证机制集成的方式。
Jwt 令牌在那里 bearer
。
要获得 header,@enet 在此处提供了 Question/Answer,向您展示了如何从 Blazor 服务器应用程序访问 HttpRequest。 - How to use the HttpContext object in server-side Blazor to retrieve information about the user, user agent.
我没有一个方便的项目可以为您编写一些代码的 JWT 令牌。其他人可能能够使用代码添加另一个答案或添加一些代码。
您可以访问 access token
和 refresh token
,如下所述,前提是您已将应用设置为使用 Jwt 令牌身份验证 (OpenID Connect)。请参阅 AuthenticationStateProvider
的答案,只需搜索“enet Whosebug 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 身份验证