Проверка подлинности с помощью форм через проверку подлинности Windows

У меня есть веб-сайт, над которым я работаю, который имеет развертывание как в интрасети, так и в Интернете. Единственная разница между ними — пара настроек конфигурации.

Интернет-версия работает нормально, так как она просто использует аутентификацию с помощью форм (которая определена в его веб-конфигурации), и если пользователь не вошел в систему, он перенаправляется на страницу входа.

Интранет-версия немного сложнее... когда пользователь впервые заходит на сайт, объект принципа контекста http правильно устанавливается с помощью WindowsPrincipal, но, используя эту информацию, я подтверждаю, что пользователю разрешен доступ к приложению, а затем создаю свой собственный IPглавный экземпляр.

Учитывая это, я хочу сделать здесь несколько вещей... Я хочу использовать объект WindowsPrincipal в качестве основы для аутентификации пользователя, но затем с этого момента вперед использовать аутентификацию форм (т. е. использовать файл cookie для хранения сведений об аутентификации и т. д. ). Мне также нужно, чтобы экземпляр принципа, который я извлекаю из контекста HTTP, принадлежал моему типу IPrinciple.

Как мне лучше всего это сделать? Как и в том, что я должен смотреть на Session_Start global.asax для выполнения логики аутентификации, а затем каким-то образом заставить его хранить мой собственный IPrinciple (поэтому для любого запроса после этого момента экземпляр является моим собственным принципом), или мне лучше всего делать что-то с Application_AuthenticateRequest .

Ура Энтони


person vdh_ant    schedule 25.08.2009    source источник


Ответы (1)


Избегайте объекта сеанса для этого. Application_AuthenticateRequest — это то, что вам нужно. Там вы можете взять WindowsPrincipal, а затем перейти к базе данных, чтобы заполнить свой собственный объект, реализующий IPrincipal. Это означает, что Application_AuthenticateRequest вызывается очень часто, поэтому в своих приложениях я предпочитаю кэшировать данные ролей как минимум на несколько секунд, чтобы сократить циклы обращения к базе данных. Это также работает с проверкой подлинности с помощью форм. Единственная разница между этими двумя методами заключается в том, что в сценарии Forms вы получаете GenericPrincipal из модуля аутентификации Forms и используете его для получения собственного пользовательского объекта принципала вместо WindowsPrincipal.

Еще один результат установки HttpContext.Current.User в Application_AuthenticateRequest заключается в том, что, в отличие от того, если вы поместите своего принципала в объект Session, вы можете использовать декларативную безопасность, например украшая свои методы с помощью PrincipalPermissionAttribute.

person Dave Markle    schedule 25.08.2009
comment
Не могли бы вы ответить stackoverflow.com/questions/9588265/ ? - person LCJ; 06.03.2012