2010-02-17 8 views

ответ

3

Я бы посоветовал не принимать его. .Net уже имеет множество встроенных функций для реализации функций безопасности. Не заново изобретайте колесо, особенно там, где это касается безопасности.

Вам не нужно внедрять поставщик членства. Все, что вам нужно сделать, это установить HttpContext.User на заказ IPrincipal, и вы можете использовать User.IsInRole("role") и [AuthorizeAttribute(Roles="role")].

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

+0

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

1

Это не плохой, но хорошим принципом является использование объекта Principal и использование поставщика членства для ответа на ваши запросы для ролей.

+1

Мне нравится, как вы использовали «принцип» и «принцип» в том же предложении. : x –

+0

Возможно, вам нужно перечитать предложение. Я говорил о принципе, и принцип предполагает использование Принципала. Для ясности вы можете заменить принцип слова «общей практикой». – Kangkan

4

Как правило, в любое время, когда вы переворачиваете свою собственную безопасность, в лучшем случае это сомнительно. Есть ли причина, по которой вы не можете использовать встроенный объект User и метод IsInRole для определения?

+2

Что вызывает сомнение и почему? Роллинг собственной безопасности или кеширование роли в сеансе? – DOK

+0

, чтобы использовать встроенный IsInRole, вы должны использовать asp.net roleprovider или создать пользовательский, но вы должны реализовать стандартную версию, в которой есть много вещей, которые мне нужно будет просто оставить, чтобы не бросать реализовать исключение – Omu

+0

Gee ... Я * никогда * не сделал это, и я использовал его как минимум в 10 приложениях на производстве. user.IsInRole («MyAdminGroup») .... –

0

Или если у вас есть роли пользовательских безопасности вы можете построить у вас есть классы, содержащие всю необходимую информацию, то после Войти сохранить весь класс к сессии, чтобы сохранить запрашивая dabase каждый раз вам нужна информация

0

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

1

Вместо создания новой переменной сеанса, как об использовании существующего HttpContext.Current.User? То есть в пространстве имен System.Security.Principal.

Он имеет множество функций, которые вы можете заполнить, а затем проверить с помощью if (thisUser.IsInRole("admin")) ...

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

System.Web.Security.FormsIdentity id = new FormsIdentity(new FormsAuthenticationTicket("dok", false, 30)); 
     string[] roles = { "admin" }; 
     HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id, roles); 
+0

Вы не можете заполнить этот массив – Omu

Смежные вопросы