#c# #asp.net-core #iis #asp.net-core-3.1
#c# #asp.net-core #iis #asp.net-core-3.1
Вопрос:
Мой локальный ASP.Net Веб-приложение Core 3.1 развернуто в IIS и имеет только включенную проверку подлинности Windows.
Как перенаправить не прошедших проверку подлинности пользователей в представление без появления запроса учетных данных? Например. перейдите в PublicIndex, не запрашивая у пользователя данные для входа. Возможно ли это?
Нужно ли мне реализовать пользовательский атрибут / фильтр для перехвата запроса, как показано ниже, или я могу выполнить какую-то конфигурацию маршрута в Startup.cs?
// Private page for authenticated users
[RedirectToPublicIndexIfNotAuthenticated]
public async Task<IActionResult> AuthenticatedIndex()
{
return View();
}
// Public page for anonymous users
public async Task<IActionResult> PublicIndex()
{
return View();
}
Комментарии:
1. Я не думаю, что вы можете. Базовая аутентификация очень небезопасна в этом отношении. Вам нужен единый вход. Для этого вам потребуется некоторая конструкция SAML, например, с использованием ADFS.
2. Пользователям, которым не удалось выполнить проверку подлинности Windows на стороне IIS, выдается страница с ошибкой 401.1. Вы можете настроить это в IIS для перенаправления на понравившуюся вам страницу.
Ответ №1:
В этой ситуации у вас есть два разных способа; Но в качестве первого решения будет изменен параметр.Значение LoginPath для действия, которое вы хотите перенаправить неавторизованным пользователям — находится в службах.Метод AddAuthentication() в StartUp.cs — это не очень хорошая идея (потому что это может вызвать некоторые проблемы при входе в систему).
Поэтому я настоятельно рекомендую вам использовать второе решение, выполнив следующие действия…
Вы, должно быть, использовали спецификации утверждений для входа своих пользователей, поэтому всякий раз, когда авторизованный пользователь пытается подключиться к вашим действиям, вы уже сохранили его имя пользователя, адрес электронной почты или эти фрагменты информации. Вот пример сохранения информации об учетной записи пользователя с использованием утверждений при входе в систему…
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, user.Username),
new Claim(ClaimTypes.Email, user.Email)
};
Как вы можете видеть, мы можем получить доступ к имени пользователя авторизованного пользователя, когда захотим, используя User.Identity.Name
переменную.Но если пользователь не авторизован, это даст нам нулевое значение.
Используя этот трюк, вы можете контролировать и перенаправлять своих пользователей в каждом нужном вам действии
// Private page for authorized users
[Authorized]
public IActionResult AuthenticatedIndex()
{
#region Conditions
if (User.Identity.Name == null)
{
return RedirectToAction("PublicIndex", "Home", new { area = "" });
}
#endregion
return View();
}
// Public page for anonymous users
public IActionResult PublicIndex()
{
return View();
}
Надеюсь, это было полезно,
удачи!