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

时间:2019-09-01 20:32:46

标签: asp.net-core blazor blazor-server-side

我想显示当前登录用户的电子邮件地址。但是我不知道如何得到它。我搜索了许多小时,却一无所获。我找到了一些片段来获取姓名,但没有找到任何片段来获取其他字段,例如电子邮件或电话号码。 此代码段中的用户没有ID,无法从数据库中获取该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.");
        }
    }
}

3 个答案:

答案 0 :(得分:5)

对于具有身份的Asp.Net Core Blazor,“声明”将不包含电子邮件声明。

要获取用户,您可以尝试使用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.");
        }
    }
}

答案 1 :(得分:1)

在我看来,您没有通过身份验证机制将电子邮件地址作为声明的一部分传递。不确定您使用的是哪个提供程序(Identity Server等),请查看以下链接,尤其是有关声明和过程逻辑的部分可能是您问题的答案:here

同样,我认为问题出在索赔上。从理论上讲,一旦您收到了电子邮件,您就应该可以通过通用的代码委托人来访问它。

答案 2 :(得分:0)

我猜想,如果ClaimPrincipal对象(代码段中的用户)包含电子邮件声明,则可以这样检索它:

https://kingjames.herokuapp.com/api/bible/1/1/1

如果未将电子邮件添加为声明,则可以通过如下调用UserManager.GetEmailAsync方法来检索电子邮件:

https://kingjames.herokuapp.com/api/bible/${params.book}/${params.chapter}/${params.verse}

注意:您还可以将电子邮件声明添加到检索到的ClaimsPrincipal,并从应用程序中的任何位置访问它。

希望这对您有帮助...