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

Cod*_*Lee 4 c# asp.net-identity azure-active-directory blazor

在为身份验证提供的模板中,您可以看到 LoginDisplay 组件中显示的电子邮件地址,这就是 的属性Name...Identity如下所示:

<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>

Run Code Online (Sandbox Code Playgroud)

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

@context.User.Claims.Where(c => c.Type == "name").FirstOrDefault().Value.ToString()
Run Code Online (Sandbox Code Playgroud)

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

Dmi*_*lov 8

如果您有需要的东西,Claims这里是获得它的最佳地方。您可以向您的应用程序添加额外的声明- 请参阅在 ASP.NET Core Web 应用程序中添加额外的声明Identity来了解如何执行此操作。如果这还不够,并且您希望完全访问授权组件标记内的实体,您可以通过将它们注入到您的页面来实现。IdentityUserAuthenticationStateProviderUserManager<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.";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)