Проверка подлинности компонентов Razor

Как можно использовать аутентификацию SignInAsync как вызов из бритвенного компонента. Кажется, что возникают некоторые ошибки из-за того, что контекст находится в позднем состоянии конвейера.

Ошибка при вызове HttpContext.SignInAsync:

System.AggregateException: 'One or more errors occurred. (The response headers cannot be modified because the response has already started.)'    
InvalidOperationException: The response headers cannot be modified because the response has already started.

Вот файл UserState.cs, в котором реализован вход в систему.

public class UserState
{

    readonly IHttpContextAccessor Context;

    public UserState(IHttpContextAccessor Context)
    {
        this.Context = Context;
    }

    public string DisplayName { get; set; }

    public ClaimsPrincipal User => Context.HttpContext.User;

    public bool IsLoggedIn => User?.Identity.IsAuthenticated ?? false;

    public void SignIn()
    {
        var claims = new List<Claim> {
            new Claim(ClaimTypes.Name, "Bob", ClaimValueTypes.String),
            new Claim(ClaimTypes.Surname, "Builder", ClaimValueTypes.String),
        };
        var userIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
        var userPrincipal = new ClaimsPrincipal(userIdentity);

        Context.HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, userPrincipal,
            new AuthenticationProperties
            {
                ExpiresUtc = DateTime.UtcNow.AddMinutes(20),
                IsPersistent = true,
                AllowRefresh = true
            }).Wait();
    }
}

метод вызывается и вводится как таковой:

@page "/"
@inject UserState User

@if (User.IsLoggedIn)
{
   <p>You are logged in</p>
} else {
  <p>You are NOT logged in</p>
}

<button onclick="@User.SignIn">Login</button>

Есть ли способ войти в систему, получить успешный ответ, а затем обновить страницу с помощью метода входа.

Я видел подобную реализацию с использованием контроллеров MVC. Нет ли способа вызвать запрос аутентификации без участия mvc?


person Theodor Solbjørg    schedule 28.03.2019    source источник
comment
<button onclick="@User.SignIn">Login</button> должен войти внутрь else, верно?   -  person dcg    schedule 29.03.2019
comment
Что это значит <button onclick="@User.SignIn">Login</button>? Он даже не компилируется   -  person Alexander    schedule 29.03.2019
comment
Использование компонентов Razor .NET Core 3.0 (Visual Studio 2019)   -  person Theodor Solbjørg    schedule 29.03.2019
comment
Вы когда-нибудь это решали? У меня такая же проблема (серверный Blazor).   -  person Fred    schedule 20.06.2019
comment
Нет, у меня была страница Razor, на которую приложение перенаправляет, когда требуется авторизация. Кажется, что возиться с промежуточным запросом httpcontext - это большой запрет, но странно, что у blazor нет обработчика предварительного запроса, который мы тоже можем подключить. оставляя это открытым для какого-то гения, чтобы ответить на это '   -  person Theodor Solbjørg    schedule 21.06.2019


Ответы (1)


Я определенно не гений в этой теме, но я совершенно уверен, что вход в компоненты .razor невозможен (если, возможно, с Javascript ??), необходимо использовать что-то вроде .cshtml.

Даже готовый вход в систему, который вы получаете при создании нового серверного проекта с индивидуальной аутентификацией, использует Login.cshtml:

-> Щелкните правой кнопкой мыши проект -> Добавить -> Новый элемент скаффолда ... -> AddIdentity -> Выбрать все -> Добавить

введите здесь описание изображения

Серверная сторона Blazor в основном отправляет html клиенту, я могу несколько понять, что логин / установка файлов cookie является проблемой, когда вы на самом деле работаете на сервере (установка cookie с помощью только html невозможна, насколько мне известно?). Но мне не удалось найти никакого объяснения, я более-менее догадываюсь :(

Замечание: при использовании .cshtml для входа в систему у меня получился странный двойной рендеринг, решенный заменой следующей строки в _Host.cshtml

@(await Html.RenderComponentAsync<App>(RenderMode.ServerPrerendered)

с участием

@(await Html.RenderComponentAsync<App>(RenderMode.Server)

Видеть:

person Heinzlmaen    schedule 18.05.2020