Как получить аутентифицированного пользователя из базы данных в Blazor

Я хочу отображать адрес электронной почты текущего вошедшего в систему пользователя. Но я не знаю, как это получить. Я искал много часов и ничего не нашел. Я нашел фрагмент для получения имени, но не фрагмент для получения других полей, таких как адрес электронной почты или номер телефона. У пользователя в этом фрагменте нет идентификатора, чтобы получить его из базы данных.

@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.");
        }
    }
}

person Taladan    schedule 01.09.2019    source источник


Ответы (2)


Для 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.");
        }
    }
}
person Edward    schedule 02.09.2019
comment
Вот это да. это сложно. Мне нужен идентификатор пользователя при каждом изменении и добавлении функции в базу данных. Теперь я должен вставить в каждый компонент по 3 строки кода? есть ли способ переработать код как класс обслуживания или производный класс? - person Taladan; 03.09.2019
comment
MSDN: SignInManager ‹TUser› и UserManager ‹TUser› не поддерживаются в компонентах Razor (docs.microsoft.com/en-us/aspnet/core/blazor/security/) - person Mofaggol Hoshen; 01.07.2020

Мне кажется, что вы не передаете адрес электронной почты как часть требования обратно из механизма аутентификации. Не уверены, какой провайдер вы используете (сервер идентификации и т. Д.), Взглянув на следующую ссылку, в частности, раздел, в котором говорится о претензиях и процедурной логике, может быть ответом на ваш вопрос: здесь

Опять же, я считаю, что проблема в претензии. Как только вы получите электронное письмо с претензией, теоретически вы должны иметь к нему доступ через общий принцип в коде.

person PeculiarJoe    schedule 01.09.2019