如何解决在登录 Blazor Server .Net Core 5 站点时在哪里设置会话变量?
我正在构建一个 Blazor Server .Net Core 5 站点,并希望在用户登录时从数据库中查找一些值并将它们设置为我可以从任何页面访问的会话变量。在默认的 Blazor 项目中,用户被定向到“身份/帐户/登录”,但该实际页面似乎被隐藏了......否则我认为这将是存储用户变量的明智位置。
_LoginPartial.cshtml
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
Logindisplay.razor
<a href="Identity/Account/Login">Log in</a>
但是没有这样的页面:
Blazor login pages hidden printscreen
我已经看到有一些方法可以将身份页面带入项目中,以便对其进行编辑,但这不是我想要做的。在哪里放置我的代码以在登录时从数据库中查找数据并设置会话变量以便它只运行一次的最佳位置?
我想当我在做的时候......我正在考虑在 Startup.cs 的范围服务类中设置这些会话值,如下所示:
services.AddScoped<UserSessionService>();
这对于存储所有用户特定会话变量的地方有意义吗?或者有更好的方法吗?
解决方法
这是我根据 How to get fresh information whether the user is logged in? 所做的。
在我的 MainLayout.razor
中,我有以下代码:
@inherits LayoutComponentBase
@inject AuthenticationStateProvider AuthenticationStateProvider
@inject UserService UserService
<MainLayoutHeader/>
<main>
@Body
</main>
<MainLayoutFooter />
@code {
private bool authenticated;
protected override void OnInitialized()
{
Task<AuthenticationState> _currentAuthenticationStateTask;
AuthenticationStateProvider.AuthenticationStateChanged += OnAuthenticationStateChanged;
_currentAuthenticationStateTask =
AuthenticationStateProvider.GetAuthenticationStateAsync();
OnAuthenticationStateChanged(_currentAuthenticationStateTask);
}
private void OnAuthenticationStateChanged(Task<AuthenticationState> authenticationStateTask)
{
_ = InvokeAsync(async () =>
{
var authState = await authenticationStateTask;
var user = authState.User;
authenticated = user.Identity?.IsAuthenticated ?? false;
Console.WriteLine("OnAuthenticationStateChanged - {0}",authenticated);
if (authenticated)
{
await this.UserService.FetchAsync(
user);
}
StateHasChanged();
});
}
}
`UserService` is my service to fetch user info from the API.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。