Поиск инфраструктуры авторизации для использования в проекте ASP.NET MVC
У меня есть проект asp.net mvc, и постоянный обрабатывается репозиториями. Форма аутентификации используется. Теперь мне нужно реализовать авторизацию. Например, мне нужно убедиться, что пользователь менеджера может только открывать свои задачи и назначать работников для этих задач. Работник будет видеть только те задачи, которые ему поручены. Супер-модератор может редактировать все. Есть ли готовый к использованию каркас, который позволяет мне определять разрешения?
Я нахожусь в процессе оценки Ayende Rhino Security . Где я могу получить больше примеров кодов? Каково ваше мнение о Rhino Security?
Мой проект использует Linq to SQL и не использовал NHibernate. Может ли Rhino Security работать без NHibernate?
3 ответа
Боюсь, Rhino Security зависит от работы Nhibernate.
Я оцениваю Rhino Security в течение нескольких месяцев, и в конце концов я решил использовать его, потому что это действительно очень хороший продукт.
Хорошую полезную информацию вы можете найти в блоге Айенде или здесь. Я немного потрудился, чтобы интегрировать его в StructureMap (вместо Castle Windsor). Вы можете найти некоторую информацию здесь.
Чтобы сделать то, что вы пытаетесь достичь, вы должны определить класс, который реализует интерфейс IEntityInformationExtractor.
Прежде всего вы должны добавить следующие ссылки (я перекомпилировал Rhino Security с NH 3.0):
- Microsoft.Practices.ServiceLocation
- NHibernate
- NHibernate.ByteCode.Castle
- StructureMap
- Rhino.Security
- StructureMapAdapter
Затем вы определяете загрузчик:
public static class Bootstrapper
{
public static void Initialize()
{
ObjectFactory.Initialize(cfg =>
{
cfg.UseDefaultStructureMapConfigFile = false;
cfg.IgnoreStructureMapConfig = true;
cfg.AddRegistry<StructureMapRegistry>();
});
ServiceLocator.SetLocatorProvider(() => new StructureMapServiceLocator(ObjectFactory.Container));
}
}
Затем вы определяете класс реестра StructureMap:
public class StructureMapRegistry : Registry
{
public StructureMapRegistry()
{
string ConnDb = "Data Source=(local); Initial Catalog=RhinoSecurity_Test; Trusted_Connection=true;";
For<ISessionFactory>()
.Singleton()
.TheDefault.Is.ConstructedBy(() => new NHSessionFactory(ConnDb, false).SessionFactory);
For<ISession>()
.Singleton()
.TheDefault.Is.ConstructedBy(x => x.GetInstance<ISessionFactory>().OpenSession());
For<IAuthorizationRepository>()
.Use<AuthorizationRepository>();
For<IPermissionsService>()
.Use<PermissionsService>();
For<IAuthorizationService>()
.Use<AuthorizationService>();
For<IPermissionsBuilderService>()
.Use<PermissionsBuilderService>();
For<IEntityInformationExtractor<Model.Task>>()
.Use(p =>
{
return (new TaskInfromationExtractor(p.GetInstance<ISession>()));
});
}
}
NHSessionFactory в основном создает фабрику сессий NH.
Я создал класс (TaskInfromationExtractor), который реализует IEntityInformationExtractor. Это позволит вам определить разрешения для объекта задачи. Теперь ваше приложение готово. Вам просто нужно "загрузить" карту структуры:
- Bootstrapper.Initialize ();
Вы сделали бы это, когда ваше приложение запускается. Теперь вы можете использовать репозиторий и службы безопасности Rhino для создания пользователей, групп, отношений и т. Д., Как я вам предлагаю. Вы можете найти образец, который я подготовил здесь
Я думаю, что атрибуты asp.net mvc будут хороши для такой задачи.
Сначала вам нужно создать какой-то список ролей и как-то связать его с пользователем. Чем вам нужно хранить роли пользователя в сеансе после входа в систему. Чем пометить контроллеры или действия с этим атрибутом. В атрибуте вы должны передать роли, которые должны выполнить какое-то действие. В реализации атрибута вам нужно просто проверить, есть ли у пользователя какая-то роль, тогда нечего делать, иначе перенаправить на несанкционированную страницу. Или выбросить какое-то пользовательское исключение и перенаправить в global.asax.
Мб проверьте эту статью для примера кода.
Проверьте это тоже. Это простой в использовании.