Технические вопросы и ответы QA1277

Учетные данные безопасности

Q: Я пишу программу, использующую Authorization Services. Когда я вызываю AuthorizationCopyRights, иногда я получаю диалоговое окно пароля, и иногда я не делаю. Что продолжается?.

A: Это касается плохо понятого аспекта Authorization Services и Сервера безопасности. Для понимания, что продолжается необходимо понять, как Сервер безопасности реализует авторизацию.

Учетные данные - что-то, что Сервер безопасности знает об определенном пользователе. Стандартным примером учетных данных является знание, что определенный пользователь ввел имя и пароль действительного пользователя.

Сервер безопасности поддерживает глобальную переменную (сеанс на вход в систему) кэш учетных данных и кэш учетных данных на экземпляр авторизации [1]. Когда Вы запрашиваете авторизацию на определенное право, правильная спецификация (найденный в базе данных политики авторизации в /etc/authorization) указывает список учетных данных, которые должны быть получены для предоставления права. Это может также включать a shared ключ, определяющий, совместно используются ли учетные данные. Для каждых учетных данных в правильной спецификации Сервер безопасности пытается получить учетные данные из кэша учетных данных. Это сначала смотрит в кэше учетных данных, связанном с экземпляром авторизации. Если учетные данные не там, и учетные данные совместно используются, это тогда смотрит в глобальном кэше учетных данных. Если Сервер безопасности не может найти учетные данные в кэше, это пытается получить учетные данные. Обычно это включает подъем диалога аутентификации, где пользователь должен ввести имя пользователя и пароль. Однако на некоторых конфигурациях Mac OS X, это может получить учетные данные от других мест (таких как смарт-карта).

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

Если правильная спецификация имеет a timeout ключ, его значение указывает, сколько времени (в секундах) кэшируемые учетные данные применимы для этого права. Значение 0 средних значений, что учетные данные могут только использоваться один раз (т.е. это сразу испытывает таймаут). Если ключ тайм-аута отсутствует, учетные данные могут всегда использоваться для предоставления права (если учетные данные не уничтожаются, посмотрите ниже).

Вышеупомянутое походит на мелочи фаната безопасности, пока Вы не понимаете некоторых важных последствий:

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

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

Примечания:

  1. Экземпляр авторизации более или менее эквивалентен AuthorizationRef, если Вы воплощаете, несмотря на то, что у Вас могут быть многократные процессы, совместно использующие тот же экземпляр авторизации AuthorizationRef и передайте его между процессами.



История версии документа


ДатаПримечания
26.07.2011

Переформатированное содержание и внесло незначительные редакционные изменения.

06.08.2003

Новый документ, обсуждающий AuthorizationCopyRights и отношение между Authorization Services, сеансами авторизации, Сервером безопасности, учетными данными и кэшем учетных данных.