如何通过组织身份验证从 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 组件中显示的电子邮件地址,即...Identity
的Name
属性,如下所示:
<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
实体的完全访问权限,您可以通过 AuthenticationStateProvider
和 UserManager<IdentityUser>
将它们注入您的 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 hereUserManager
和 SigninManager
在 Razor 组件中不受支持。
如果您使用的是 IdentityDbContext,您也可以通过数据库上下文从用户 DbSet 中检索用户。以上是关于如何通过组织身份验证从 Blazor Server 中的身份获取用户属性的主要内容,如果未能解决你的问题,请参考以下文章
使用服务器端 Blazor,在连接到 SQL Server 数据库时如何使用 Windows 身份验证模拟用户?
Microsoft Graph API - Blazor Server App .NET 5.0 使用 Azure 身份验证,MsalUiRequiredException 因用户质询而引发