2013-09-19 2 views
0

Есть ли способ изменить параметры атрибута во время выполнения? У меня есть служба, в которой я назначаю роли, которые могут получить доступ к сервису. Я хочу назначить эти роли во время выполнения.Как изменить параметр атрибута Authorize во время выполнения

[HttpGet] 
    [Authorize(Roles="admin")] 
    public DataTable GetAllProducts() 
    { 
     FormToken auth = new FormToken(); 
     DataTable dt = new DataTable(); 
     if (!auth.isAuthenticated()) 
     { 
      dt.Columns.Add("Error"); 
      DataRow dr = dt.NewRow(); 
      dr["Error"] = "Login to get the Service"; 
      dt.Rows.Add(dr); 
      return dt; 
     } 
     var rec = from log in db.Products select log; 
     return rec.ToDataTable(); 
+0

Я знаю, что вопрос такого же типа задавался раньше, но я не нашел удовлетворительного ответа на него. – vivek

ответ

1

Вивек,

Атрибут авторизированным может быть унаследован от и вы можете переопределить метод OnAuthorize. Что-то вроде ниже.

public sealed class AuthorizationAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     //do custom authorization here 
     base.OnAuthorization(filterContext); 
    } 
} 

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

Cheers

+0

действительно полезно. спасибо – vivek

1

Метод, предложенный @Nico, будет работать.

Альтернатива, которая, возможно, обеспечивает лучшую герметизацию и гибкость, заключается в использовании ClaimsPrincipalPermissionAttribute вместо AuthorizeAttribute. Это часть WIF, которая теоретически является предпочтительной основой для идентификации и авторизации в .NET.

В этой модели ClaimsPrincipalPermissionAttribute определяет контекст авторизации запроса, с точки зрения ресурсов и операции - что он описывает запрос, не то, кто может получить доступ к нему.

Фактическая логика авторизации затем инкапсулируется в пользовательский ClaimAuthorizationManager, которому предоставляется текущий пользовательский принцип и контекст авторизации. Работа - это просто проверка авторизации. Управление ClaimAuthorizationManager осуществляется с помощью конфигурации в файле web.config приложения.

Все это описано здесь

http://msdn.microsoft.com/en-us/library/system.identitymodel.services.claimsprincipalpermissionattribute.aspx

Хотя я предпочитаю этот метод я не думаю, что есть очень веские причины, чтобы предпочесть один над другим. Я думаю, что преимущество этого подхода являются:

  • Это обеспечивает лучшую герметизацию
  • Это более гибкая
  • Он вызывается CLR, а не в рамках MVC, то есть это будет вызвана с помощью модульных тестов или в любом месте декорированный метод называется
  • Он может быть использован императивно, а также декларативно (ClaimsPrincipalPermission.CheckAccess("Customer","Add"))
  • Это, как представляется, в большей степени совпадают с направлением Microsoft собираются

Недостатком является

  • Это .Net 4.5 только. Если вы находитесь на .Net 3.5 или 4, вам придется использовать более раннюю версию WIF. Он очень похож на версию .Net 4.5 (но не идентичен).Пространства имен являются Microsoft.IdentityModel вместо System.IdentityModel

Как я уже говорил, хотя, это в основном вопрос предпочтения, на мой взгляд.

+0

Спасибо @Mike. Я попробую. – vivek

0

Для не декларативной проверки прав пользователей вы можете использовать System.Security.Permissions.PrincipalPermission вместо AuthorizeAttribute. Это позволит вам указать целевую роль во время выполнения. В зависимости от того, как вы выполняете аутентификацию, вам может потребоваться, чтобы назначенный аутентифицированный пользовательский пользователь был назначен Thread.CurrentPrincipal, что и используется PrincipalPermission, а не только HttpContext.Current.User (это то, что использует MVC AuthorizeAttribute).

+0

Можете ли вы привести пример кода, чтобы использовать это? – vivek

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