OWIN Проблема со смешанной аутентификацией IIS - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть проект, где требуется проверка подлинности Windows и вход в систему с помощью форм.Я столкнулся с OWIN Mixed Authentication , которая, кажется, отвечает моим требованиям.

Перед внедрением в свой собственный проект я попытался запустить пример решения из исходной ссылки.

Я отладилрешение с использованием IIS Express, и когда я ввел свои учетные данные в диалоговое окно проверки подлинности Windows, мои правильные учетные данные были найдены в переменной logonUserIdentity.

Но при настройке локального сайта IIS добавьте следующее свойство делегирования функциикак указано в файле readme:

Authentication - Windows to Read/Write  

Когда я ввел свои учетные данные в диалог аутентификации Windows, NT AUTHORITY \ IUSR отображается в переменной logonUserIdentity вместо имени пользователя Iв диалоговом окне.

Я чувствую, что это происходит, потому что AllowAnonymous включен на сайте IIS, но необходимо остановить цикл входа в систему, который происходит из-за CookieAuthentication в Startup.Authкласс.

Как настроить сайт IIS, чтобы диалоговое окно учетных данных Windowsпроходит через введенные учетные данные, а не NT AUTHORITY \ IUSR.

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Моя привязка сайта IIS была установлена ​​на http://projectname

Когда я изменил привязку на сайте IIS на http://localhost или http://pcname, он позволял мне проходить через правильные учетные данные Windows.

0 голосов
/ 19 апреля 2019

Я отладил решение с помощью IIS Express, и когда я ввел свои учетные данные в диалог аутентификации Windows, мои правильные учетные данные были найдены в переменной logonUserIdentity.

Насколько я знаю, IIS express использует текущую учетную запись компьютера в качестве учетной записи анонимного входа. Таким образом, вы обнаружите, что logonUserIdentity является правильным. Вы можете попробовать войти в приложение с другой учетной записью домена. Вы обнаружите, что он по-прежнему использует текущую учетную запись компьютера, но не измененную на учетную запись пользователя.

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

Смешанный собственный аутентификатор использует внешний вход asp.net для внешнего входа в систему для входа в систему с помощью windows. Сначала внешний логин asp.net будет идти к поставщику mixauth для проверки результата аутентификации Windows.

В случае успеха он вернется к методу ExternalLoginCallback контроллера учетной записи с информацией о Windows и будет использовать эту информацию для идентификации пользователя.

По моему мнению, если вы хотите получить текущий логин пользователя, я предлагаю вам попробовать использовать сеанс для сохранения логина windows в учетной записи пользователя в методе ExternalLoginCallback.

Подробнее, вы можете обратиться к ниже кодов:

    [AllowAnonymous]
    public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
    {

        var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();

        Session["LoginonUsername"] = loginInfo.DefaultUserName;
        if (loginInfo == null)
        {
            return RedirectToAction("Login");
        }

        // Sign in the user with this external login provider if the user already has a login
        var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false });
            case SignInStatus.Failure:
            default:
                // If the user does not have an account, then prompt the user to create an account
                ViewBag.ReturnUrl = returnUrl;
                ViewBag.LoginProvider = loginInfo.Login.LoginProvider;
                return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email });
        }
    }

Результат:

enter image description here

...