Аутентификация компонентов бритвы
Как использовать аутентификацию 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>
Есть ли способ войти получить успешный ответ, а затем обновить страницу из метода SignIn.
Я видел похожую реализацию с использованием контроллеров MVC. Нет ли способа вызвать запрос аутентификации без участия mvc?
0 ответов
Я определенно не гений в этой теме, но я совершенно уверен, что вход в компоненты.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)
Увидеть: