Вы должны расширить классы 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 или получить вдохновение от этого, чтобы сделать это самостоятельно.
Мне интересно, как добавить дискретные разрешения для этих ролей. –
Важно ли, чтобы эти разрешения были дискретными?Использование инфраструктуры авторизации на основе роли ASP.NET MVC переносит ответственность за обработку/отклонение запроса от вас, тем самым уменьшая объем кода, который вы должны писать в целом. Я бы порекомендовал вам не писать больше кода, чем нужно для удобства обслуживания. –
Важно, чтобы разрешения были дискретными, потому что мы хотим иметь возможность изменять разрешения, предоставляемые каждой ролью. –