2010-07-02 2 views
3

В asp.net веб-приложении Я ограничил действия пользователей в зависимости от их ролей вроде как следоватьИспользования ролей в ASP.NET

Я создал три таблицы в базе данных

Таблицы

Таблицы: пользователи

UserID Username Password 
1 Bob password1 
2 Scott password2 
3 Jisun password3 
4 Sam password4 
5 John password5 

Таблица: Группы

GroupID Name 
1 Administrators 
2 Clerk 
3 Manager 
4 Cashier 

Таблица: Роли

UserID GroupID 
1 1 
2 2 
2 3 
3 4 
4 3 
4 4 

В Global.asax файл я написал следующее

Sub Application_AuthenticateRequest(sender As Object, e As EventArgs) 
    If Request.IsAuthenticated Then 
     'Determine this user's roles 
     Dim reader As SqlDataReader = _ 
       SqlHelper.ExecuteReader(connection string, _ 
       CommandType.StoredProcedure, "rolesForUser", _ 
       New SqlParameter("@Username", User.Identity.Name)) 

     ' Create an array of role names 
     Dim roleList As New ArrayList 
     Do While reader.Read() 
      roleList.Add(reader("Name")) 
     Loop 

     'Convert the roleList ArrayList to a String array 
     Dim roleListArray As String() = roleList.ToArray(GetType(String)) 

     'Add the roles to the User Principal 
     HttpContext.Current.User = _ 
      New GenericPrincipal(User.Identity, roleListArray) 
    End If 
End Sub 

И в asp.net файл кода следующий код

If User.IsInRole("Administrator") then 
    ' Display sensitive material 
ElseIf User.IsInRole("Clerk") then 
    ' Display moderately sensitive material 
Else 
    ' Display only bland material 
End If 

, как теперь он работает нормально. Теперь новое требование привлекло внимание, чтобы позволить клерку получить доступ к некоторым (но не всем) функциям, выполняемым администратором.

Нужно ли мне изменить исходный код для обеспечения выше нового требования?

Нужно ли делать то же самое снова и снова, когда такое требование возникает в будущем?

или любой другой способ, я могу сделать, пожалуйста, предложите мне.

+4

Заголовок должен быть вопрос а не вопрос имя искателя – ckv

ответ

1

Код, который вы должны изменить, - это файлы кода asp.net с кодом.

Это должно использоваться, чтобы показать «Клеркам» дополнительную информацию, в которой они нуждаются.

Вы не должны поднять приказ Клерка администратору, а только предоставить Клеркам права, которые они должны иметь.

2

Как заявил Робин Дейв, то, что вы будете менять, не является той парадигмой роли, которую вы реализовали, а скорее специфической функциональностью, к которой имеет доступ «клерк». Эти изменения будут происходить везде (код, встроенный код, классы и т. Д.), Которые вы определяете, и т. Д. Действия, выполняемые клерком.

Мой следующий вопрос не связан с функциональностью клерка как таковой, но вы рассмотрели членство ASP.NET (и SqlRoleProvider) и его реализацию ролей?

0

Я настоятельно рекомендую вам заняться днями, чтобы исследовать функциональность пользовательского поставщика членства и ролей ASP.NET. Есть так много задач, которые выполняются «под капотом», когда членство используется правильно. Вы можете защитить целые страницы, отдельные навигационные узлы (используя SiteMapProvider) или даже отдельные элементы управления с помощью однострочного интерфейса.

0

Необходимо отменить членство в вашей роли (вы назовете их группами) из кода приложения и перейдите к permission-based authentication model. Это позволит вам изменить разрешения для каждой группы, поскольку изменения будущих потребностей, как вы предложили.

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

1

ASP.NET с тех пор, как версия 2.0 стала частью стандартной функциональности, которая позволяет использовать членство и роли. Есть несколько отличных ресурсов по использованию стандартных функций: ASP.NET security tutorials.

Если у вас уже есть устаревшая база данных, то создать пользовательский провайдер и подключить его можно довольно просто. Например, custom membership provider.

Если у вас есть несколько баз данных, вы можете проверить эту статью: Create Membership tables in another database than the standard aspnetdb.mdf.

0

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

If Authorizer.UserHasAccessToFunctionality(user, "Sensitive") Then 
    ' Display sensitive material  
    Else If ... 

Логика авторизации в псевдокоде:

public Shared Function UserHasAccessToFunctionality(user as IPrincipal, _ 
    functionality as string) as Boolean 
    functionalities = Authorizationrepository.GetFunctionalityForRoles(user.Roles) 
    Return functionalities.Contains(functionality) 
    End Function 

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

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

Таблица: Функциональности

ID Name 
1 Sensitive 
2 Protected 
3 Public 

Таблица: RoleFunctionalities

Role Functionality 
1 1 
1 2 
2 2 
3 3 
Смежные вопросы