ASP.NET Core 1.1 Объедините проверку подлинности Windows с формой входа в качестве запасного варианта

В настоящее время мы создаем пробное концептуальное приложение с ASP.NET Core 1.1. Цель состоит в том, чтобы обеспечить единый вход на уровне интрасети и предложить страницу входа для доступа через Интернет.

Пока я могу получить билет Kerberos, установив "windowsAuthentication": true в настройках IIS (launchSettings.json) соответственно web.config.

Я создаю свое собственное промежуточное ПО аутентификации / обработчик аутентификации, чтобы продолжить.

Если пользователь еще не аутентифицирован, я перенаправляю его на страницу входа.

НО вот моя проблема. Первый запрос всегда нулевой, затем сервер вызывает Kerberos и получает билет. (Могу ли я упустить понимание того, как на самом деле работает Kerberos и сложные задачи)

В моей функции HandleUnauthorizedAsync я не могу знать, отвечает ли IIS на билет или нет, и поэтому перенаправляю их до того, как ответ придет от IIS.

Кто-нибудь пробовал что-то подобное или знает, как решить проблему?

С уважением

Изменить. Имейте в виду, что в настоящее время это предназначено только для проверки концепции и тестирования.

Хендлеаутентатеасинк:

        if(Context.User?.Identity?.AuthenticationType == "Kerberos") {

            var identity = new ClaimsIdentity(new GenericIdentity(Context.User.Identity.Name, AeroAuthenticationOptions.DefaultSchemaName), new Claim[] {
                // get claims from claim store
            });

            var principal = new ClaimsPrincipal(identity);
            var ticket = new AuthenticationTicket(principal, new Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties { }, AeroAuthenticationOptions.DefaultSchemaName);

            return AuthenticateResult.Success(ticket);

        }

        return AuthenticateResult.Skip();

HandleUnauthorizedAsync:

        if(context == null) {

            throw new ArgumentNullException(nameof(context));

        }

        var properties = new AuthenticationProperties(context.Properties);
        var redirectUri = properties.RedirectUri;
        if(string.IsNullOrEmpty(redirectUri)) {

            redirectUri = OriginalPathBase + Request.Path + Request.QueryString;

        }

        var loginUri = Options.LoginPath + QueryString.Create(Options.ReturnUrlParameter, redirectUri);
        var redirectContext = new AeroCookieRedirectContext(Context, Options, BuildRedirectUri(loginUri), properties);
        await Options.Events.RedirectToLogin(redirectContext);

        return true;

person Mario    schedule 11.05.2017    source источник
comment
Мне пришлось реализовать аналогичный сценарий несколько недель назад, пожалуйста, опубликуйте свой код, чтобы мы могли увидеть детали реализации и помочь вам лучше.   -  person univ    schedule 11.05.2017
comment
Привет, я рад, что не один такой :) Дело не в неработающем коде, а в понимании. Как я могу перехватить аутентификацию Kerberos, не зная, что она оспаривается... Может быть, вам разрешено делиться своими знаниями?   -  person Mario    schedule 11.05.2017
comment
Вы смотрели на идентификационный сервер 4?   -  person Muqeet Khan    schedule 11.05.2017
comment
Я специально не использовал kerberos, но я работал с клиентом, который требовал пользовательской двухуровневой аутентификации и должен был использовать встроенную аутентификацию Windows и пользовательское промежуточное программное обеспечение для получения ролей пользователей из их внутренней базы данных (определенно не идеально, но они были непреклонны, вот как они хотели быть Поэтому я хотел взглянуть на ваш код и проверить, не выскочило ли что-нибудь странное.   -  person univ    schedule 12.05.2017
comment
Я наткнулся на это решение для выхода из системы с помощью windowsauth в .net mvc, возможно, это поможет: stackoverflow.com/questions/17871816/   -  person Yush0    schedule 23.10.2017