Я создал простое приложение бритвенной страницы, в котором вход в систему использует AddAuthentication() и проверяет, чтобы имя пользователя и пароль соответствовали значениям в db. Затем каждая страница авторизуется на основе этого, поэтому только зарегистрированные пользователи могут переходить на другие страницы. Моя модель представления входа включает следующий тип аутентификации:
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, UserName)
};
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
if (RememberMe)
{
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
new AuthenticationProperties
{
IsPersistent = RememberMe,
ExpiresUtc = DateTimeOffset.UtcNow.AddHours(2)
});
}
else
{
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity));
}
return RedirectToPage("/index");
Теперь мне нужно создать функцию выхода из системы. Я чувствую, что выход из системы в панели навигации довольно распространен. Моя панель навигации построена с использованием общего _layout. Итак, сначала мне нужно передать какую-то модель этому классу _layout, чтобы я мог поймать событие onpost, чтобы удалить файл cookie сеанса или постоянный файл cookie, если он существует, и перенаправить пользователя на страницу входа.
Как это можно сделать без контроллеров для поддержки подхода MVVM?
Во-вторых, что касается выхода из системы. я хочу использовать
public async Task<IActionResult> Logout()
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return RedirectToPage("/index");
}
В модели я перехожу к _layout. Однако использование HttpContext будет работать только с PageModel, поэтому просто создание класса модели, похоже, не работает, но вместо этого мне нужно создать частичный класс PageModel для перехода к _layout. Мысли?
Спасибо
Обычно я использую отдельную страницу Razor с выделенным кодом, который выполняет выход из системы. Вы должны дать некоторую обратную связь пользователю после выхода из системы, а не просто перенаправить пользователя на индексную страницу. Следовательно, вы можете получить ссылку на свою страницу выхода из макета, поскольку выход из системы можно выполнить с помощью GET.
Если вы используете POST, метод должен быть назван OnPostLogout
в вашем коде программной части. Я не вижу смысла использовать для этого POST, нет данных для отправки.
Ааааааа я тоже только что понял. Все еще учусь, если вы не можете сказать. Я думаю, вы правы, что POST, вероятно, того не стоит. При использовании GET вы просто используете метод OnGet по умолчанию, сгенерированный с новыми моделями страниц, но с возвращаемым типом Task<IActionResult> (т.е. public Task<IActionResult> OnGetLogout())?
Да, OnGet будет достаточно. При этом вы также можете пропустить перенаправление после публикации :-)
Как ни странно, выполнение пользовательского обработчика asp-page-handler и вызов Logout и создание метода, поскольку OnGetLogout, похоже, ничего не делает. Удаление обработчика и просто выполнение OnGet работает. Интересно, почему вы не можете сделать это для OnGet. Большое спасибо за Вашу помощь!
Приятно :-) Тогда вы на шаг впереди, чтобы стать разработчиком. Пожалуйста, не забудьте принять мой ответ, чтобы закрыть дело. BR
Я нажал зеленую галочку, чтобы принять, но, думаю, у меня еще нет репутации, чтобы проголосовать за него. Еще раз спасибо!
Спасибо, что приняли ответ. При публикации на другие страницы используйте <form method = "post" asp-page = "/Login">
, а в коде программной части используйте OnPost.
Спасибо. Основываясь на вашей логике, я добавил страницу выхода и модель, а в моем _layout используйте POST, используя этот макет <form asp-page-handler = "Logout" method = "post" asp-page = "/Logout">. В модели страницы выхода я вызываю public async Task<IActionResult> Logout(), но он никогда не используется. Что я упускаю из этого? Кроме того, почему бы не использовать POST, а получить запрос GET?