Пользователи с разными возможностями

Я создаю приложение ASP.Net MVC 5. На моем сайте существует 3 разных типа пользователей.

  • Администратор
  • Обычные пользователи
  • Рестораны

Каждый из этих пользователей имеет свои возможности и права доступа. То есть вид для каждого из них должен быть разным.

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

public class User : IUser
{
    public User()
        : this(String.Empty)
    {
    }

    public User(string userName)
    {
        UserName = userName;
        Id = Guid.NewGuid().ToString();
    }

    [Key]
    public string Id { get; set; }

    [Required]
    public string UserName { get; set; }

    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    public string Phone { get; set; }
    public string MobilePhone { get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    public virtual IList<UserAddress> Addresses { get; set; }
}

public class Restaurant
{
    [Key]
    public int ID { get; set; }

    [Required]
    public string Name { get; set; }

    public virtual IList<RestaurantAddress> Addresses { get; set; }

    public virtual IList<RestaurantFood> Menu { get; set; }

    public virtual IList<Review> Reviews { get; set; }

    [DataType(DataType.Url)]
    public string Website { get; set; }

    [DataType(DataType.PhoneNumber)]
    public string Phone { get; set; }

    [DataType(DataType.PhoneNumber)]
    public string Fax { get; set; }

    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    public int Seats { get; set; }

    public double AverageRating { get; set; }
    public double AveragePrice { get; set; }
}

person Alireza Noori    schedule 17.08.2013    source источник
comment
этот пост может быть полезен   -  person Sirwan Afifi    schedule 17.08.2013
comment
@SirwanAfifi Спасибо. В какой-то степени это было полезно. Мне придется поискать еще. Моя проблема заключается в следующем: как лучше всего изменить существующие модели, чтобы добавить поддержку этой гибкости. Должен ли я добавить всю информацию в модель User? Должен ли я добавить внешний ключ в модель User? Я хочу интегрировать дополнительную информацию в модель.   -  person Alireza Noori    schedule 17.08.2013
comment
@AlirezaNoori Я обновил свой ответ, который может дать вам точную информацию о том, как его реализовать. Вам не обязательно нужен ASP Security Kit, если вы можете потратить много часов, чтобы разобраться с реализацией.   -  person Varun K    schedule 17.08.2013


Ответы (3)


Я не уверен, что правильно понял ваш вопрос, но если вы используете шаблон интернет-приложения, вы можете просто управлять контролем доступа к своему приложению с помощью управления ролями.

Прежде всего, добавьте несколько ролей в таблицу webpages_Roles вашей базы данных.

Затем просто добавьте пользователей к этим ролям:

Role.AddUserToRole("role1");

Теперь для фильтрации содержимого вам просто нужно выполнить две задачи:

1) отфильтровать запрос контроллера на соответствующие роли с помощью атрибута [Authorize]:

[Authorize(Roles = "role1, role2, ...")]

2) Отобразите соответствующий контент для соответствующего пользователя. Сначала получите роли текущего пользователя:

var roles = Roles.GetRolesForUser(User.Identity.Name);

Затем, согласно его/ее ролям, визуализировать содержимое для него/нее:

bool hasRole1 = roles.Contain("role1") | roles.Contain("admin");
// ...
@if (hasRole1)
{
    // Show content for role1 users...
}
person Amin Saqi    schedule 21.08.2013
comment
Спасибо большое. Хотя большинство людей указали мне в этом направлении, чтобы получить коды, которые вы упомянули выше, мне пришлось прочитать пару образцов. Я хочу, чтобы вы опубликовали это раньше. Тем не менее я принимаю это как четкий ответ. - person Alireza Noori; 21.08.2013
comment
@AlirezaNoori - Очень приятно быть полезным - person Amin Saqi; 21.08.2013
comment
@AminSaghi Можем ли мы использовать то же самое с нашими пользовательскими таблицами (или не использовать таблицу «webpages_Roles») - person kbvishnu; 22.08.2013
comment
@VeeKayBee - Да, все возможно! Тем не менее, это не простая работа, поэтому я никогда не пытаюсь пройти через это вообще...!!! Если вам нужен собственный, полностью настраиваемый подход, вам следует настроить поставщика членства и поставщика ролей. Я просто знаю, что вы выполняете эту настройку в файле we.config, но я ничего не знаю о том, как это сделать... - person Amin Saqi; 22.08.2013
comment
@AminSaghi большое спасибо за ваши комментарии. Когда я реализовывал авторизацию пользователей, мы испробовали множество подходов и решили создать собственный механизм, чтобы в будущем использовать модификации клиента. Поэтому я считаю, что есть предел для нашей настройки, и после 2 или 3 лет производства вам необходимо перестроить всю структуру, если требуется клиент, который не обрабатывается текущим подходом. - person kbvishnu; 22.08.2013

Авторизация может быть выполнена на основе ролей пользователей.

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

Например,

Администратор группы пользователей Обычные пользователи Рестораны

Роли Все привилегии Базовые привилегии Промежуточные привилегии

Вам нужно использовать фильтры действий, чтобы получить это. http://msdn.microsoft.com/en-us/library/dd410209(v=vs.100).aspx

Далее нам нужно назначить привилегии для каждой роли

All Privileage — addUser, addResturant и т. д. (вы можете использовать понятные имена для административных целей. Их можно отобразить в пользовательском интерфейсе, но нам нужно сохранить имя контроллера и имя действия. В случае addUser понятное имя будет Add User, и мы сохраним как ниже

ActionsTable (actionId, friendName, Controller, Action)
1 -Add User - Users - Add 

RolesActionMapTable (roleId, actionID)
1-1

RolesTable (RoleId,Role Name,Desc)
1-AllPrivileage

GroupsTable (GroupId, GroupName)
1-Admin

GroupRoleMap (groupId, roleID)
1-1

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

ИЗМЕНИТЬ

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

ИЗМЕНИТЬ 2

public class CustomAuthorizeAttribute: AuthorizeAttribute
{
   protected virtual bool AuthorizeCore(
    HttpContextBase httpContext)
 {
   // 1.Httpcontext can gives you the controller and action
   // 2. retrive the group of user and check the user is allowed to execute this action
   // 3. if allowed, then return true else return false.
   // 4. You can redirect to another page saying you are not allowed to access this action
  }
)
}


//In controller
public class EmployeeController: Controller {

 [CustomAuthorize]
  public Create()
   {
   }

}

Надеюсь это поможет

person kbvishnu    schedule 17.08.2013
comment
Спасибо. Теперь я немного запутался: D Есть ли учебник с примерами кода, который мне поможет? - person Alireza Noori; 17.08.2013
comment
У меня такая же ситуация год назад. Я не могу поделиться кодом и позвольте мне поискать некоторые учебники stackoverflow.com/questions/11829937/ - person kbvishnu; 17.08.2013
comment
Спасибо большое. Не могли бы вы помочь мне обновить мои модели? Я хочу, чтобы пользователь имел основную информацию и, в зависимости от типа пользователя, получал расширенную информацию для него/нее. Должен ли я использовать: public virtual string Reestaurant ID { get; set; } или public virtual Restaurant Restaurant { get; set; } - person Alireza Noori; 17.08.2013
comment
Для лучших решений вам нужно задать другой вопрос. Также, если вы чувствуете, что я помог вам, примите это как ответ. - person kbvishnu; 17.08.2013
comment
Я оставил вопрос открытым, чтобы другие пользователи могли его увидеть. Спасибо. - person Alireza Noori; 17.08.2013

Чтобы достичь этого масштабируемым образом с детальным контролем, вам нужна авторизация на основе разрешений. Вы можете попробовать что-то вроде ASP Security Kit. Комплект безопасности ASP создан с нуля для создания таких систем.

Изменить: вот как это может работать:

  1. Вы определяете уникальный код разрешения для каждого метода действия. Например, СоздатьРесторан, ЗарезервироватьРесторан
  2. Эти коды разрешений хранятся в главной таблице разрешений в базе данных.
  3. Вы можете создать отдельную таблицу ролей и соответствующим образом связать разрешения. Однако в ASP Security Kit представлена ​​новая концепция подразумеваемые разрешения, поэтому вам не нужна роль как отдельная конструкция; вы просто создаете разрешение более высокого уровня, например, «Владелец ресторана», и делаете другие разрешения, подразумеваемые им.
  4. Существует таблица UserPermit, которая связывает разрешения с пользователями. Для определенного типа пользователей E.G. владелец ресторана, вы будете назначать соответствующие разрешения при создании пользователя.
  5. Когда пользователь входит в систему, вы загружаете его разрешения в память.
  6. Вам нужен механизм, с помощью которого каждое действие контроллера выполняется только в том случае, если пользователь обладает уникальным кодом разрешения, связанным с этим действием. Если пользователь этого не сделает, вы перенаправите его на страницу по умолчанию с сообщением «несанкционированное действие».
  7. Вы также можете просмотреть права пользователя, загружаемые для отображения или скрытия пунктов меню.

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

Раскрытие информации: я создатель ASP Security Kit.

person Varun K    schedule 17.08.2013