Ошибка IdentityServer4 при использовании WindowsAuthentication - PullRequest
0 голосов
/ 18 февраля 2020

Я успешно следовал учебному пособию по Deblokt на IdentityServer4 (https://deblokt.com/2020/01/24/01-identityserver4-quickstart-net-core-3-1/). В этом руководстве используется интерфейс IdentityServer4 QuickstartUI. Идентификация по ID пользователя / паролю с использованием базы данных As pNet Identity работает.

Я использую самую последнюю версию. Net Core (3.1), которая немного отличается от учебника, но работает.

Теперь я пытаюсь добавить Windows Аутентификация и попадание ошибки во время выполнения. Что меня смущает, так это то, что ошибка возникает после , когда пользователь успешно аутентифицирован windows. Я работаю локально на компьютере Windows 10 в Visual Studio 2019 в режиме отладки, используя Google Chrome.

Согласно документации IdentityServer4 (https://identityserver4.readthedocs.io/en/latest/topics/windows.html#using -kestrel ) I добавил это в мой файл Startup.cs:

services.Configure<IISServerOptions>(iis =>
{
    iis.AuthenticationDisplayName = "Windows";
    iis.AutomaticAuthentication = false;
});

Затем я щелкнул правой кнопкой мыши по проекту, выбрал «Свойства», выбрал вкладку «Отладка» и проверил «Windows Аутентификация»:

enter image description here

Это делает кнопку "Windows" видимой, когда я перехожу к / Account / Login:

enter image description here

При нажатии кнопки «Windows» обратная передача обрабатывается внутри метода «Challenge» ExternalController, с «Windows» в качестве аргумента провайдера и «~ /» для аргумента returnUrl. Поскольку аргумент провайдера равен "Windows", этот метод вызывает ProcessWindowsLoginAsyn c, передавая аргумент returnUrl.

В первый раз ProcessWindowsLoginAsyn c вызывает HttpContext.AuthenticateAsyn c ("Windows" ), который возвращает нулевой принципал, который вызывает метод для повторного вызова / External / Challenge ("Windows"), который вызывает ProcessWindowsLoginAsyn c второй раз, что, в свою очередь, вызывает HttpContext.AuthenticateAsyn c (" Windows "), и этот второй вызов выполнен успешно - HttpContext.AuthenticateAsyn c возвращает принципала windows (это я), и я могу просмотреть его в отладчике и убедиться, что все мои данные верны.

ProcessWindowsLoginAsyn c затем выполняет этот вызов:

await HttpContext.SignInAsync(
    IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme,
    new ClaimsPrincipal(id),
    props
);

Это выполняется без ошибок. Аргумент "id" - это ClaimsIdentity с двумя утверждениями, извлеченными из моего windows удостоверения личности, субъекта и имени.

На данный момент все выглядит хорошо. Метод ProcessWindowsLoginAsyn c заканчивается перенаправлением на / External / Callback. Это где ошибка происходит. Метод method / External / Callback содержит этот бит кода сверху и выдает исключение, которое вы видите. По неизвестным причинам HttpContext.AuthenticateAsyn c не выполняется.

var result = await HttpContext.AuthenticateAsync(IdentityConstants.ExternalScheme);
if (result?.Succeeded != true)
{
    throw new Exception("External authentication error");
}

Объект "result" имеет значение "Succeeded", равное false, и значение "None", равное true, другие свойства (Principal, Свойства и Билет) все недействительны.

Любой совет приветствуется.

1 Ответ

0 голосов
/ 18 февраля 2020

Исправлено: измените это в строке 173 ExternalController.cs:

await HttpContext.SignInAsync(
           IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme,
            new ClaimsPrincipal(id),
            props);

На это:

await HttpContext.SignInAsync(
                IdentityConstants.ExternalScheme,
                new ClaimsPrincipal(id),
                props);

Это кажется очевидным задним числом: AuthenticateAsyn c и SignInAsyn c должен ссылаться на ту же схему.

После того, как я наткнулся на решение, я заметил, что у gitub IdentityServer4 уже есть закрытый отчет об ошибках с марта 2018 года, я не знаю, почему эта ошибка все еще является частью быстрого запуска хотя: https://github.com/IdentityServer/IdentityServer4/issues/2166

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...