[英]How to call a method in Blazor Server Side App on get set of a parameter
[英]Blazor - How to call method to set user data after successful log in
我有一个托管的 Blazor WebAssembly 应用程序,我强制用户在启动时登录。 我已将此逻辑放在 MainLayout.razor 页面中,如下所示:
protected override async Task OnInitializedAsync()
{
var user = (await AuthenticationStateTask).User;
if (user.Identity.IsAuthenticated)
{
await SetUserInfo(user);
}
else
{
AuthMessage = "User is NOT authenticated";
NavigationManager.NavigateTo($"authentication/login?returnUrl={Uri.EscapeDataString(NavigationManager.Uri)}");
}
}
我想要做的是在用户成功登录后调用 SetUserInfo 方法(目前它会在启动应用程序时始终导航到登录页面),但不知道该怎么做。 似乎 OnInitializedAsync 方法只运行一次,除非您手动刷新页面。 有任何想法吗? 提前致谢。
弄清楚了。 需要在组件中使用 OnParametersSetAsync()。
[CascadingParameter] protected Task<AuthenticationState> AuthenticationStateTask { get; set; }
protected override async Task OnParametersSetAsync()
{
var user = (await AuthenticationStateTask).User;
if (user.Identity.IsAuthenticated)
{
await SetUserInfo(user);
}
}
使用 OnAfterRenderAsync
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
var authenticationState = await authenticationStateTask;
if (authenticationState.User.Identity.IsAuthenticated)
{
}
}
}
在 LoginDisplay 组件上
@code {
[CascadingParameter]
private Task<AuthenticationState> authenticationStateTask { get; set; }
private string _authMessage;
private async Task LogUsername()
{
var authState = await authenticationStateTask;
var user = authState.User;
if (user.Identity.IsAuthenticated)
{
_authMessage = $"{user.Identity.Name} is authenticated.";
wait SetUserInfo(user);
}
}
}
我认为最干净的解决方案是:
添加一个 Blazor 组件,例如“CallMe”(缩写代码)
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@inject IDataService DataService
...
@code{
[CascadingParameter] protected Task<AuthenticationState> AuthState { get; set; } = null!;
protected override async Task OnInitializedAsync()
{
var user = (await AuthState).User;
if (user.Identity.IsAuthenticated)
{
var email = user.FindFirst("preferred_username").Value;
var user = await DataService.GetUserAsync(email);
}
}
}
并在 LoginDisplay.razor -> 授权上下文中“调用”它。
<AuthorizeView>
<Authorized>
@context.User.Identity?.Name!
<CallMe></CallMe>
<button class="nav-link btn btn-link" @onclick="BeginLogout">Log out</button>
</Authorized>
<NotAuthorized>
<a href="authentication/login">Log in</a>
</NotAuthorized>
</AuthorizeView>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.