Авторизация на основе ролей с модельным списком

У меня 3 модели [User, Role и UserRole]

Use {ID [PK], Name, Email, Password, .....}
Role {ID [PK], Name, Description, .......}
UserRole {UserID [FK], RoleID [FK]}

Рассмотрим авторизацию на основе ролей на контроллере с использованием атрибута [Authorize], указывающего, что пользователь должен быть в роли администратора для доступа к любому действию контроллера в классе.

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

Это нормально, мне нужно,

Есть ли способ назначить мою коллекцию ролей атрибуту [Authorize]? Например

Я получу назначенные роли от вошедшего в систему пользователя и сохраню их в списке. Можно ли присвоить этот Список атрибуту [Авторизовать]? что-то вроде следующего:

[Authorize(Roles = MyDynamicallyLoadedList)]
public class PageController : Controller
{
    // Controller code here
}

person Shreekumar S    schedule 04.09.2012    source источник
comment
1+, Проголосуйте, хороший вопрос ....   -  person Amit Prajapati    schedule 04.09.2012


Ответы (2)


Ну и две проблемы.

Во-первых, вы не можете использовать список в качестве параметра атрибута. Вместо этого вы можете использовать массив. http://msdn.microsoft.com/fr-fr/library/ms177221%28v=vs.100%29.aspx

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

Вы получите такое сообщение:

Аргумент атрибута должен быть константным выражением, выражением typeof или выражением создания массива с типом параметра атрибута.

Решением было бы создать новый атрибут авторизации (унаследованный от AuthorizeAttribute) и переопределить AuthorizedCore

Пример (который вы можете адаптировать к своей проблеме) можно найти здесь

person Raphaël Althaus    schedule 04.09.2012

да.

  1. Переопределить PostAuthenticateRequest в global.asax
  2. Загрузите роли из БД
  3. Создать новый GenericPrincipal
  4. Назначьте принципала Thread.CurrentPrincipal и HttpContext.Current.User

Пример:

protected void Application_OnPostAuthenticateRequest(object sender, EventArgs e)
{
    if (User.Identity.IsAuthenticated)
    {
        string[] rolelist = GetRoleListForUserFromAPI(User.Identity.Name);
        HttpContext.Current.User = new GenericPrincipal(User.Identity, rolelist);
        Thread.CurrentPrincipal = HttpContext.Current.User;
    }
}
person jgauffin    schedule 04.09.2012
comment
Можете ли вы предложить мне несколько руководств или блогов, чтобы я мог пошагово - person Shreekumar S; 04.09.2012
comment
Чувак, извини, я новичок в этом, не могли бы вы дать мне более подробный пример? и как это можно применить к атрибуту [Authorize] контроллера? - person Shreekumar S; 04.09.2012
comment
В приведенном выше примере загружаются все роли, которые есть у текущего пользователя. Роли, указанные в атрибуте, определяют роли, необходимые для действия. Это две очень разные вещи. Непонятно, что вы действительно ищете. - person jgauffin; 04.09.2012