Я уже знаю, что вы говорите (плохая идея), но, пожалуйста, сначала прочитайте :)
Я разрабатываю приложение на основе ASP.NET MVC, для которого потребуются некоторые специфические функции:
комбинация «локальных» пользователей и логина facebook connect, но пользователи FB будут «отражаться» в каком-то локальном представлении, потому что будет некоторая статистика и другие вещи, необходимые для хранения для обоих типов.
авторизация будет трехуровневой вместо стандартных двухуровневой asp.net. Под этим я подразумеваю: пользователь находится в группе (m:n), а группа находится в роли (m:n), а не пользователь в роли (m:n).
Итак, если бы я хотел использовать стандартный подход аутентификации/авторизации, мне пришлось бы:
реализовать пользовательский провайдер членства, и это будет даже «правильным», потому что он будет использовать такие методы, как AddUserToGroup и AssignRoleForGroup и т. д.
реализовать собственный Принципал/Идентификацию для доступа к моим собственным объектам пользователя
приведение HttpContext.User к моему объекту каждый раз, когда это необходимо...
реализовать пользовательский поставщик ролей
собственный механизм использования AuthCookie (уникальный идентификатор пользователя в пользовательских данных, нельзя полагаться на имя пользователя со сторонними пользователями FB в системе)
... (вы, конечно, можете придумать что-то еще)
Ну, мне действительно не нравится идея «сгибать» и заменять каждую часть, чтобы в итоге получить довольно грязное решение. Поэтому я думаю реализовать свой собственный механизм, инкапсулированный в одном месте — назовем его AuthService.
- AuthService будет потокобезопасным синглтоном
- Вместо AuthCookie будет использоваться стандартный объект сеанса (я знаю, что сеансы также используют файлы cookie, но я действительно не вижу преимущества низкоуровневого хранилища (файлов cookie) над сеансом)
- AuthService предоставит AuthService.CurrentUser (моего собственного типа), заполняемый из сеанса в начале каждого запроса (я думаю, Application_AuthenticateRequest)
- AuthService предоставит в одном месте все методы — ValidateUser, RolesForUser, IsInRole, Logout и т. д.
Так что теперь... почему бы мне не сделать это таким образом? :)
Я думаю, что сеанс одинаково безопасен для AuthCookie (те же риски для билета и authcookie). Я действительно не ищу «модульности» (поставщики ролей plug-and-play, поставщики членства, поставщики профилей..) - я имею дело здесь с довольно специфическими вещи, я не ожидаю, что стандартные компоненты подойдут ... есть ли у «моего подхода» какие-либо другие недостатки?
Спасибо за все хорошие идеи и извините за мой ужасный английский, я из неанглоязычной страны :)
R.