Как убедить Internet Explorer разрешить аутентификацию другого пользователя? - PullRequest
3 голосов
/ 29 ноября 2010

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

Мы разрабатываем веб-приложение для корпоративной среды Microsoft Active Directory и используем проверку подлинности Windows, предоставляемую IIS, для проверки подлинности пользователей для единого входа, а также проверки подлинности с помощью форм. Я знаю, что IIS жалуется, когда оба включены, но он работает очень хорошо, и у каждого сайта, на котором мы развернули, не было никаких странных ухищрений - до сих пор.

Новый сайт имеет «общие» компьютеры, которые постоянно входят в систему с общей учетной записью, которая имеет доступ только для чтения к приложениям, которые им необходимо использовать. Это означает, что мы не можем различать пользователей, которые должны иметь разные разрешения для приложения; нам нужен какой-то способ запроса пользователя для аутентификации.

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

После небольшого мозгового штурма и выяснения способа работы аутентификации IIS казалось, что наиболее простым способом решения проблемы является выдача 401 Unauthorized в ответ на пользователя, известного как общая учетная запись. Начальные тесты здесь казались плодотворными, что привело к успешным изменениям имени пользователя в браузере, однако прототип на сайте не запрашивал учетные данные, и браузер сохранял те же данные учетной записи. Мы также попали в специфичный для IE javascript

document.execCommand("ClearAuthenticationCache")

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

Теперь мы застряли. У нас есть варианты обхода проблемы, но они определенно не «правильные» ответы:

  • требует, чтобы пользователи вышли из общей учетной записи, прежде чем войти в наше приложение (... блин)
  • исключить наше веб-приложение из зоны интрасети на всех машинах
  • предоставляет пользователям возможность входа в систему без единого входа

Я убежден, что есть канонический способ сделать это - известный паттерн, общая базовая проблема, которая уже решена, что-то в этом роде - и мне очень интересно услышать, какие изобретательские методы существуют для решения такого рода проблемы, и если кто-то еще когда-либо действительно испытывал что-то вроде этого.

Ответы [ 2 ]

1 голос
/ 17 декабря 2010

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

Надеюсь, это кому-нибудь поможет.Требуется .NET Framework 3.5+.

using System.DirectoryServices.AccountManagement;

private static bool IsLdapAuthenticated(string username, string password)
{
    PrincipalContext context;
    UserPrincipal principal;

    try
    {
        context = new PrincipalContext(ContextType.Domain);
        principal = Principal.FindByIdentity(context, IdentityType.SamAccountName, username) as UserPrincipal;
    }
    catch (Exception ex)
    {
        // handle server failure / user not found / etc
    }

    return context.ValidateCredentials(principal.UserPrincipalName, password);
}
1 голос
/ 29 ноября 2010

Не могли бы вы создать страницу, к которой общим учетным записям запрещен доступ.Затем сделайте переадресацию на эту страницу с обратным URL-адресом, закодированным в строке запроса, в любой момент, когда вам нужно, чтобы пользователь повторно прошел аутентификацию с использованием не общей учетной записи?Это должно заставить браузер открыть обычный диалог входа в систему.

После повторной аутентификации пользователя новая страница должна просто перенаправить обратно на URL-адрес возврата в строке запроса.

...