Автоматическое перенаправление при сбое авторизации с использованием автоматической проверки подлинности IIS с ASP.NET Core MVC - PullRequest
0 голосов
/ 27 февраля 2019

Я создаю веб-сайт в ASP.Net Core MVC и использую автоматическую аутентификацию IIS для автоматической проверки пользователей компании через активный каталог.В настоящее время это работает так, как должно, Я бы хотел перенаправить пользователей на страницу входа, если их невозможно проверить с помощью IIS. Я видел другие публикации, описывающие, как это сделать.при использовании обычного куки-файла аутентификации, но не с этой автоматической аутентификацией.

Это мой текущий метод Configure Services:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(IISDefaults.AuthenticationScheme);

        services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.Configure<IISServerOptions>(options =>
        {
            options.AutomaticAuthentication = true;
        });

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

Так что на данный момент он успешно блокирует пользователей, которые неиметь авторизацию AD на странице с пометкой [Authorize], я просто хочу перенаправить заблокированный трафик на другую страницу с пометкой [AllowAnonymous].Есть ли способ изменить метод services.Configure?Пока ничего не вижу.

1 Ответ

0 голосов
/ 28 февраля 2019

То, что вы используете, называется Аутентификация Windows .Ссылка на AutomaticAuthentication просто говорит IIS автоматически устанавливать HttpContext.User с данными пользователя (в противном случае это не так, даже если аутентификация прошла успешно).

Что вы ищетеfor - это на самом деле два метода аутентификации: для людей с учетными записями AD (которые вошли в систему с этими учетными записями), авторизуйте их автоматически, используя аутентификацию Windows.В противном случае покажите экран входа в систему, и вы сможете самостоятельно выполнить аутентификацию.

Я делал это раньше в ASP.NET MVC, но я еще не делал этого в ASP.NET Core.Я опишу, что я сделал, но это не полное решение, так как в ASP.NET Core отсутствует часть.

Используйте куки в качестве основного метода аутентификации.Установите его как обычно, со страницей входа, где вы проверяете учетные данные и устанавливаете cookie .

Установите одно действие контроллера (скажем, /Login/SSO), которое использует проверку подлинности Windows.Я сделал это с помощью тега location в web.config.Это, вероятно, то же самое в ASP.NET Core, я просто не совсем уверен, как вы поймете это в коде.Но часть в web.config будет выглядеть примерно так:

<location path="Login/SSO">
    <system.webServer>
      <security>
        <authentication>
          <windowsAuthentication enabled="true"/>
          <anonymousAuthentication enabled="false"/>
        </authentication>
      </security>
    </system.webServer>
    <system.web>
      <authorization>
        <allow users="?"/>
      </authorization>
    </system.web>
</location>

В коде этого действия предполагается, что вы можете выяснить, как получить имя пользователя из аутентификации Windows, установить cookie и вернуть200 ОК (вам не нужно возвращать представление).Если проверка подлинности Windows завершится неудачно, IIS вернет 401 самостоятельно.(Я думаю, что <allow users="?"/> было сделано только для того, чтобы предотвратить попытку перенаправления аутентификации с помощью cookie-файлов - но я не могу вспомнить)

Причудливый трюк на странице входа в систему.Скрыть все на странице по умолчанию.При загрузке страницы выполните AJAX-запрос к /Login/SSO.Если это удастся, то пользователь войдет в систему, и вы можете переслать их (через javascript) на нужную им страницу.Если это не удается, просто показать содержимое страницы входа в систему.Это будет выглядеть примерно так (при условии, что вы используете jQuery):

$(function() {
    $.get("@Url.Action("SSO", "Login")").done(function(data) {
        //success! forward to the page they want
        window.location.replace(returnUrl);
    }).fail(function() {
        //failed - show login prompt
        $("#loginBox").show();
    });
});

При такой настройке пользователь, который может пройти проверку подлинности с помощью проверки подлинности Windows, попадет на сайт, будет перенаправлен на страницу входа,Страница входа выполняет успешный AJAX-запрос, который создает их cookie, и они перенаправляются обратно на исходную страницу, которую они хотели.Довольно бесшовные.

...