2014-02-04 4 views
7

Мы понимаем, как реализовать аутентификацию и авторизацию в удостоверении ASP.NET с помощью WebApi. Например, мы можем зарегистрировать пользователя, а затем извлечь как его безопасный токен, так и роль.Как реализовать разрешения для идентификации ASP.NET?

Теперь мы хотим добавить разрешения. Например, пользователь steve может находиться в роли admin. Теперь мы хотим присвоить права на чтение, редактирование и удаление прав администратора. Как мы это делаем в ASP.NET Identity? Есть ли существующая инфраструктура разрешений в ASP.NET Identity?

ответ

10

Я продлил ASP.NET Идентичность для обеспечения прав доступа, как вы описали его. Я сделал это, чтобы отделить модель безопасности от вашей модели приложения. Проблема с традиционным подходом к роли в AuthorizeAttribute заключается в том, что вы должны спроектировать свою модель безопасности одновременно с разработкой своего приложения, и если вы внесете какие-либо изменения, вам придется перекомпилировать и повторно развернуть свое приложение. С подходом, который я придумал, вы определяете ресурсы и операции в пользовательском атрибуте AuthorizeAttribute, где операции аналогичны разрешениям. Теперь вы украшаете методы, как это:

[SimpleAuthorize(Resource = "UserProfile", Operation = "modify")] 
public ActionResult ModifyUserProfile() 
{ 
    ViewBag.Message = "Modify Your Profile"; 
    return View(); 
} 

Затем вы можете назначить ресурс/операцию к роли в базе данных, настройку модели безопасности во время развертывания и можете изменять его без перевода. I wrote about this approach using SimpleMembership here. И позже ported it to ASP.NET Identity here. В статьях есть ссылки на полный исходный код со справочными приложениями.

0

Мы можем использовать Ролевой авторизации как

[Authorize(Roles = "Administrator")] 
public class StoreManagerController : Controller 
{ 
    // Controller code here 
} 

Мы можем создать перечисление для разрешения Пункт как:

public enum PermissionItems 
{ 
     [Group("Users")] 
     [Description("Can edit Users")] 
     EditUser, 
     [Group("Users")] 
     [Description("Can view Users")] 
     ViewUser, 
} 

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

и проверьте в метод, с помощью атрибута

RequirePermissions(PermissionItems.EditUser) 
public ActionResult Edit(int id) 
{ 

} 
+0

Мне интересно, как добавить дискретные разрешения для этих ролей. –

+0

Важно ли, чтобы эти разрешения были дискретными?Использование инфраструктуры авторизации на основе роли ASP.NET MVC переносит ответственность за обработку/отклонение запроса от вас, тем самым уменьшая объем кода, который вы должны писать в целом. Я бы порекомендовал вам не писать больше кода, чем нужно для удобства обслуживания. –

+0

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

0

Вы должны расширить классы Identity и добавить к ним эту функциональность. роли и разрешения имеют много-ко-многим отношения друг с другом, так что вы должны изменить класс IdentityRole как что-то вроде этого:

public class IdentityRole<TKey, TRolePermission> 
{ 
    public string Title { get; set; } 

    public virtual ICollection<TRolePermission> Permissions { get; set; } 
} 

Как вы можете видеть, что Вы хотите промежуточный объект и таблицу с именем RolePermission. А класс Разрешение может выглядеть как-то вроде этого:

public class IdentityPermission<TKey, TRolePermission> 
{ 
    public virtual TKey Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 

    public virtual ICollection<TRolePermission> Roles { get; set; } 
} 

Затем вы должны создать пользовательский AuthorizeAttribute выполнить проверку подлинности на контроллеры и действия. что может быть Somthing так:

public class AuthorizePermissionAttribute : AuthorizeAttribute 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     return base.AuthorizeCore(httpContext) 
       && Task.Run(() => httpContext.AuthorizePermission(Name, Description, IsGlobal)).Result; 
    } 
} 

Вы можете переопределить метод AuthorizeCore, чтобы добавить проверку подлинности разрешения на обычную проверку подлинности на основе ролей. Хотя вы можете сделать это легко, я реализовал его как открытый исходный код Permission-based Identity extension here, и вы можете использовать его direclty или получить вдохновение от этого, чтобы сделать это самостоятельно.

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