2016-05-10 3 views
1

Я пытаюсь выполнить следующиеASP.NET Идентичность роли

Есть несколько ролей (role1, роль2, role3 и т.д.), и все они имеют разные уровни доступа. Role2 может получить доступ к тому же, что и role1, но не role3.

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

+1

Почему бы не объединить роли в совокупную роль и использовать эту роль на контроллере? Вы также можете написать свой собственный AutherizationAttribute и определить свою собственную логику в этом классе. – Igor

+0

@Igor Этот пользовательский атрибут - отличная идея! Спасибо :) –

+0

Другое предложение. Если роль (N) может получить доступ к роли (N-1), то предоставить пользователям несколько ролей. Например, пользователь в роли3 также может быть в role2 и role1. Таким образом, вы не добавляете список ролей в атрибуте Authorize, но вместо этого у вас есть 1 роль, равная уровню доступа. – tmg

ответ

2

Вы можете настроить политики авторизации, чтобы группировать роли в политики.

ASP.NET Основной пример:

services.AddAuthorization(options => 
      { 
       options.AddPolicy("Role1", policy => policy.RequireRole("Role1"); 
       options.AddPolicy("Role2", policy => policy.RequireRole("Role1", "Role2"); 
       options.AddPolicy("Role3", policy => policy.RequireRole("Role1", "Role2", "Role3"); 
      }); 

и использовать свою политику в контроллерах с атрибутом авторизовать:

[Authorize(Policy = "Role3")] 
1

я решил его следующим образом:

AuthorizeRoleAttribute .cs

public class AuthorizeRoleAttribute : AuthorizeAttribute 
{ 
    public AuthorizeRoleAttribute(string role) : base() 
    { 
     var result = Enum.Parse(typeof(RolesEnum), role); 
     int code = result.GetHashCode(); 
     List<string> list = new List<string>(); 
     foreach (var item in Enum.GetValues(typeof(RolesEnum))) 
     { 
      int tmpCode = item.GetHashCode(); 
      if (tmpCode >= code) 
      { 
       list.Add(item.ToString()); 
      } 
     } 
     Roles = string.Join(",", list); 
    } 

} 

Роль ENUM:

public enum RolesEnum 
{ 
    User = 100, 
    Supervisor = 200, 
    Administration = 300, 
    Admin = 400 
} 

Контроллер:

[AuthorizationRole ("Supervisor)] // Некоторые Код

Контроллер будет автоматически искать какие роли имеют более или равный доступ к руководителю по номер в Enum.

+1

Если вам нужна дополнительная безопасность, поверните эту строку в параметр enum в конструкторе. 'AuthorizeRoleAttribute (РольEnum role): base()'. Затем вы применяете его '[AuthorizationRole (RolesEnum.Supervisor)]'. Теперь вам не нужно беспокоиться о орфографических ошибках. – Igor

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