16

Мне нужно, чтобы мой администратор мог изменять права доступа для пользователей «на лету», чтобы они могли создавать новые роли и добавлять разрешения для этих Ролей.Динамически добавлять роли для авторизации атрибута для контроллера

Я хочу, чтобы создать атрибут Authorize, чтобы придерживаться моего класса контроллера, что я могу добавить роли из базы данных, так что мне не нужно «устанавливать» роли во время разработки, как в [Authorize(Roles="Role1, Role2")] и т. Д. .

Так что-то вроде [Authorize(Roles = GetListOfRoles()]

Я нашел этот вопрос - ASP.NET MVC Authorize user with many roles, который делает что-то подобное, но, может быть, есть способ, чтобы изменить это таким образом, что он получает список разрешений/ролей из БД?

+0

Вы должны создать поставщика собственных ролей, я полагаю. Но у вас есть список contollers и всех методов в db. –

ответ

16

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

/// <summary> 
/// Custom authorization attribute for setting per-method accessibility 
/// </summary> 
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class SetPermissionsAttribute : AuthorizeAttribute 
{ 
    /// <summary> 
    /// The name of each action that must be permissible for this method, separated by a comma. 
    /// </summary> 
    public string Permissions { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     SalesDBContext db = new SalesDBContext(); 
     UserManager<ApplicationUser> userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
     ApplicationDbContext dbu = new ApplicationDbContext(); 

     bool isUserAuthorized = base.AuthorizeCore(httpContext); 

     string[] permissions = Permissions.Split(',').ToArray(); 

     IEnumerable<string> perms = permissions.Intersect(db.Permissions.Select(p => p.ActionName)); 
     List<IdentityRole> roles = new List<IdentityRole>(); 

     if (perms.Count() > 0) 
     { 
      foreach (var item in perms) 
      { 
       var currentUserId = httpContext.User.Identity.GetUserId(); 
       var relatedPermisssionRole = dbu.Roles.Find(db.Permissions.Single(p => p.ActionName == item).RoleId).Name; 
       if (userManager.IsInRole(currentUserId, relatedPermisssionRole)) 
       { 
        return true; 
       } 
      } 
     } 
     return false; 
    } 
} 
+1

Как использовать 'SetPermissionsAttribute' с помощью метода действий? что мне нужно передать вместе с 'SetPermissionsAttribute'? – Mou

+0

Прошло некоторое время, но если я правильно помню, это что-то вроде '[SetPermissions =" ​​Action1, Action2 "]', но я не уверен. –

+0

Каждый должен принять к сведению, что это было некоторое время назад, и реальные запросы LINQ могли быть улучшены, а контекст базы данных и пользовательский менеджер должны быть введены или репозиторий должен быть введен (если используется шаблон репозитория). –

7

А что-то вроде этого:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class MyCustomAuthorizationAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     // Do some logic here to pull authorised roles from backing store (AppSettings, MSSQL, MySQL, MongoDB etc) 
     ... 
     // Check that the user belongs to one or more of these roles 
     bool isUserAuthorized = ....; 

     if(isUserAuthorized) 
      return true; 

     return base.AuthorizeCore(httpContext); 
    } 
} 

Вы можете использовать его с базой данных, или просто сохранить список разрешенных ролей в web.config.

+5

Я думаю, что знаю, где вы собираетесь с этим, но ради других, кто может получить знания из этого q/a, вы можете отредактировать свой ответ, чтобы сделать его более целостным (например, включить логику авторизации пользователя, возможно также включают в себя список IdentityRoles из db в качестве примера), а затем я буду отмечать его как принятый. –

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