如何通过组织身份验证从 Blazor Server 中的身份获取用户属性

Posted

技术标签:

【中文标题】如何通过组织身份验证从 Blazor Server 中的身份获取用户属性【英文标题】:How to get user's attributes from Identity in Blazor Server with organization authentication 【发布时间】:2020-06-09 13:32:39 【问题描述】:

在为验证提供的模板中,您会看到 LoginDisplay 组件中显示的电子邮件地址,即...IdentityName 属性,如下所示:

<AuthorizeView>
    <Authorized>
        Hello, @context.User.Identity.Name!
        <a href="AzureAD/Account/SignOut">Log out</a>
    </Authorized>
    <NotAuthorized>
        <a href="AzureAD/Account/SignIn">Log in</a>
    </NotAuthorized>
</AuthorizeView>

我想知道的是如何访问有关经过身份验证的用户的其他信息。例如,以简单的方式就像一个全名。我发现使用Linq,您可以从Claims 属性中获取数据,如下所示:

@context.User.Claims.Where(c => c.Type == "name").FirstOrDefault().Value.ToString()

这是我们应该如何获取该信息的方式,还是有更好/首选的方式从经过身份验证的用户那里访问该数据?

【问题讨论】:

【参考方案1】:

如果您在Claims 中有所需的东西,这是获取它的最佳地点。您可以向您的 Identity 添加额外声明 - 请参阅 Adding extra claims in ASP.NET Core web applications 中的操作方法。如果这还不够,并且您希望在授权组件标记中获得对 IdentityUser 实体的完全访问权限,您可以通过 AuthenticationStateProviderUserManager&lt;IdentityUser&gt; 将它们注入您的 Blazor 页面来实现。

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

<p>@Details</p>

@code 

    private string Details  get; set; 

    protected override async Task OnInitializedAsync()
    
        var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
        var user = authState.User;

        if (user.Identity.IsAuthenticated)
        
            var user = await _UserManager.FindByNameAsync(user.Identity.Name)
            Details = $"Your user phone # is user.PhoneNumber.";
        
        else
        
            Details = "The user is NOT authenticated.";
        
    

【讨论】:

根据docs here UserManagerSigninManager 在 Razor 组件中不受支持。 如果您使用的是 IdentityDbContext,您也可以通过数据库上下文从用户 DbSet 中检索用户。

以上是关于如何通过组织身份验证从 Blazor Server 中的身份获取用户属性的主要内容,如果未能解决你的问题,请参考以下文章

服务器端 Blazor:刷新页面后如何保持用户身份验证?

使用服务器端 Blazor,在连接到 SQL Server 数据库时如何使用 Windows 身份验证模拟用户?

使用 Cookie 进行 Blazor 服务器端身份验证

声明的状态管理如何在 Blazor Server 中工作?

Microsoft Graph API - Blazor Server App .NET 5.0 使用 Azure 身份验证,MsalUiRequiredException 因用户质询而引发

简单服务器端Blazor Cookie身份验证的演示