Я успешно следовал учебному пособию по 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 Аутентификация»:
Это делает кнопку "Windows" видимой, когда я перехожу к / Account / Login:
При нажатии кнопки «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, Свойства и Билет) все недействительны.
Любой совет приветствуется.