#c# #asp.net-core #asp.net-core-identity
#c# #asp.net-core #asp.net-core-identity
Вопрос:
Я работаю с ASP.NET Основная идентичность. Мое приложение настроено так, чтобы требовать проверки подлинности пользователей во всем мире, а авторизация на основе ролей устанавливается для контроллеров и методов действий по мере необходимости. На моем контроллере учетной записи, который я установил [Authorize(Roles = "Admin"]
, и на действие выхода из контроллера учетной записи, которое я использовал [Authorize]
, ожидая, что все авторизованные пользователи смогут получить доступ к действию выхода из системы. Но с [Authorize(Roles = "Admin"]
установленным на контроллере пользователь перенаправляется на маршрут отказа в доступе при выходе из системы, если он / она не находится в admin role
, но если [Authorize(Roles = "Admin"]
он закомментирован, это работает как для пользователей, так admin
и non admin
для пользователей. Как я могу разрешить всем авторизованным пользователям доступ к действию выхода из системы? ниже приведен мой код
[Authorize(Roles = "Admin")]
public class AccountController : Controller
{
/*
Rest of Code
*/
[HttpPost, Authorize]
public async Task<IActionResult> Logout()
{
}
}
Комментарии:
1. Зачем разрешать функцию выхода из системы? Если кто-то не вошел в систему, это должно действовать как отказ
2. Вы могли бы просто сделать
Logout()
поддержку действий анонимной[Anonymous]
, тогда, если пользователь не вошел в систему, это было бы просто не-операцией.3. Я подумал, что это может быть угрозой безопасности…… Спасибо вам обоим!
Ответ №1:
Как говорит Мартин Мартин Костелло, вы можете добавить [AllowAnonymous]
атрибут в метод выхода из системы.
Насколько я знаю, атрибут метода действия [AllowAnonymous] не повлияет на действия другого контроллера. Таким образом, этот метод будет безопасным.
Затем вы могли бы поместить приведенные ниже коды внутри метода выхода из системы:
[AllowAnonymous]
public async Task<IActionResult> Logout(string returnUrl = null)
{
await _signInManager.SignOutAsync();
_logger.LogInformation("User logged out.");
if (returnUrl != null)
{
return LocalRedirect(returnUrl);
}
else
{
return RedirectToPage();
}
}
Ответ №2:
удалить [Авторизовать] из действия выхода