繁体   English   中英

Blazor - 登录成功后如何调用方法设置用户数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM