То, что вы используете, называется Аутентификация 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, и они перенаправляются обратно на исходную страницу, которую они хотели.Довольно бесшовные.