如何从 Blazor 中的数据库获取经过身份验证的用户

How to get authentificated user from database in Blazor

我想显示当前登录用户的电子邮件地址。但我不知道,如何得到它。我搜索了好几个小时,但一无所获。我找到了一些片段来获取名称,但没有片段来获取其他字段,如电子邮件或电话号码。 此代码段中的用户没有从数据库中获取的 ID。

@page "/"
@inject AuthenticationStateProvider AuthenticationStateProvider

<button @onclick="@LogUsername">Write user info to console</button>
<br />
<br />
@Message

@code {
    string Message = "";

    private async Task LogUsername()
    {
        var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
        var user = authState.User;

        if (user.Identity.IsAuthenticated)
        {
            Message = ($"{user.Identity.Name} is authenticated.");
        }
        else
        {
            Message = ("The user is NOT authenticated.");
        }
    }
}

在我看来,您没有将电子邮件地址作为从身份验证机制返回的声明的一部分传递。不确定您使用的是哪个提供商(Identity Server 等),请查看以下内容 link,特别是讨论声明和程序逻辑的部分可能是您问题的答案:here

同样,我认为问题在于索赔。一旦您收到索赔中的电子邮件,理论上您应该可以通过代码中的通用主体访问它。

对于 Asp.Net Core Blazor with Identity,声明将不包含电子邮件声明。

要获取用户,您可以尝试 UserManager.GetUserAsync(ClaimsPrincipal principal) 如下所示:

@page "/"
@inject AuthenticationStateProvider AuthenticationStateProvider
@using Microsoft.AspNetCore.Identity;
@inject UserManager<IdentityUser> UserManager;

<button @onclick="@LogUsername">Write user info to console</button>
<br />
<br />
@Message

@code {
    string Message = "";

    private async Task LogUsername()
    {
        var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
        var user = authState.User;

        if (user.Identity.IsAuthenticated)
        {
            var currentUser = await UserManager.GetUserAsync(user);
            Message = ($"{user.Identity.Name} is authenticated. Email is { currentUser.Email }");
        }
        else
        {
            Message = ("The user is NOT authenticated.");
        }
    }
}