2

Я создаю приложение 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; } 
} 
+0

[это] (Http: //www.dotnettips. Информация/запись/тысяча сто шестьдесят шесть /% D9% 85% D8% AF% DB% 8C% D8% B1% DB% 8C% D8% AA-% D8% B3% D9% 81% D8% A7% D8% B1% D8% B4% DB% 8C-% D8% B3% D8% B7% D9% 88% D8% AD-% D8% AF% D8% B3% D8% AA% D8% B1% D8% B3% DB% 8C-% DA % A9% D8% A7% D8% B1% D8% A8% D8% B1% D8% A7% D9% 86% D8% AF% D8% B1-mvc) Сообщение может быть полезным –

+0

@SirwanAfifi Спасибо. Это было полезно в некоторой степени. Мне придется искать еще кое-что. Моя проблема заключается в следующем: что является лучшим способом изменить существующие модели, чтобы добавить поддержку этой гибкости. Должен ли я добавить всю информацию в модель «Пользователь»?Должен ли я добавить внешний ключ к модели User? Я хочу интегрировать дополнительную информацию в модель. –

+0

@AlirezaNoori Я обновил свой ответ, который может дать вам точную информацию о том, как его реализовать. Вам не обязательно нужен ASP Security Kit, если вы можете потратить много часов, чтобы понять реализацию. –

ответ

2

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

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

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

Role.AddUserToRole("role1"); 

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

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

[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... 
} 
+0

Большое спасибо. Хотя большинство людей указали мне в этом направлении, чтобы получить коды, упомянутые выше, мне пришлось прочитать пару образцов. Я бы хотел, чтобы вы опубликовали это раньше. Тем не менее я принимаю это как ясный ответ. –

+0

@AlirezaNoori - Очень приятно быть полезным – AminSaghi

+0

@AminSaghi Можем ли мы использовать то же самое с нашими пользовательскими таблицами (или не используя таблицу «webpages_Roles») – kbvishnu

1

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

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

Для например

User Group Админ Обычные пользователи

ресторанов

Роли Все Privileage Basic Privilage Intermediate Privileage

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

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

Все Privileage - AddUser, addResturant и т.д. (Вы можете использовать понятные имена для административных целей может отображаться в интерфейсе, но нам нужно хранить контроллер. название и действие name.In случай AddUser, дружественное имя будет Добавить пользователь и хранит, как показано ниже

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 

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

EDIT

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

РЕДАКТИРОВАНИЮ 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() 
    { 
    } 

} 

Надеется, что это помогает

+0

Спасибо. Я немного запутался: D Есть ли учебник с образцами кода, которые помогут мне? –

+1

У меня такая же ситуация год назад. Я не могу поделиться этим кодом и позволить мне искать некоторые учебники http://stackoverflow.com/questions/11829937/how-to-show-or-hide-controls-based-on-roles-asp-net-mvc -4-бритва – kbvishnu

+0

Большое спасибо. Не могли бы вы помочь мне обновить мои модели? Я хочу, чтобы у пользователя была основная информация и была основана на типе пользователя, получите расширенную информацию для него/нее. Должен ли я использовать: 'public virtual string Reestaurant ID {get; задавать; } 'или ' public virtual Restaurant Restaurant {get; задавать; } ' –

0

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

Edit: Это, как он может работать:

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

Комплект обеспечения безопасности ASP делает большинство из вышеперечисленных для вас; например, он может automatically infer permission code для авторизации, поэтому вам не нужно его жестко кодировать. Кроме того, вам нужно resource checks, чтобы разные пользователи и владельцы ресторанов не играли друг с другом.

Раскрытие информации: Я являюсь создателем пакета обеспечения безопасности ASP.

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

  • Нет связанных вопросов^_^