Как перенаправить пользователя, не прошедшего проверку подлинности, на страницу без запроса учетных данных

#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();
}
  

Надеюсь, это было полезно,
удачи!