【问题标题】:How to get authentificated user from database in Blazor如何从 Blazor 的数据库中获取经过身份验证的用户
【发布时间】:2020-10-15 20:16:20
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    对于带有身份的 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.");
            }
        }
    }
    

    【讨论】:

    • 哇。这很复杂吗?我在每次更改时都需要用户 ID,并在数据库上添加 func。现在我必须在每个组件上插入 3 行代码?有没有办法像服务类或类的派生一样回收代码?
    • MSDN:Razor 组件不支持 SignInManager 和 UserManager (docs.microsoft.com/en-us/aspnet/core/blazor/security/…)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2020-04-08
      • 2021-04-07
      • 2022-10-23
      • 2021-01-10
      相关资源
      最近更新 更多