2012-09-22 5 views
1

У меня есть следующая структура в моей БД:пользователя в домене Entity

DomainEntities: 
+EntityID 
+Name 
+ParentID 
+... 

Users: 
+UserID 
+Username 
+... 

Roles: 
+RoleID 
+Name 

UserRolesAssociation: 
+RoleID 
+UserID 
+EntityID 

Так я хочу использовать MVC встроенных в атрибуте авторизации для фильтрации действий в моих контроллерах, которые сделаны разными члены.

Что я могу сказать, если пользователь1 делает действие удаления для объекта entity1 или любого объекта под ним, я могу видеть, имеет ли он правильную роль для этого и соответствующим образом фильтрует действие.

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

ответ

2

Какова была бы наилучшая практика для решения этой темы?

Пользовательский [Authorize] кажется хорошим местом для реализации этой логики.

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var authorized = base.AuthorizeCore(httpContext); 
     if (!authorized) 
     { 
      // the use ris not authenticated or not authorized - no need to continue 
      return false; 
     } 

     string username = httpContext.User.Identity.Name; 
     // read the entity id that this user is attempting to manipulate 
     string entityId = (string)httpContext.Request.RequestContext.RouteData.Values["id"] ?? httpContext.Request["id"]; 

     return IsAllowed(username, entityId); 
    } 

    private bool IsAllowed(string username, string entityId) 
    { 
     // You know what to do here - hit the database and check whether 
     // the current user is the owner of the entity 
     throw new NotImplementedException(); 
    } 
} 

, а затем:

[HttpDelete] 
[MyAuthorize] 
public ActionResult Delete(int id) 
{ 
    ... 
} 
+0

Спасибо .., что на самом деле помогает .. я никогда не создал свой собственный атрибут, который был бы хорошим местом, чтобы практиковать :) .. еще один вопрос, который вы написал, но в текущем контексте, как я могу узнать, какой объект пользователь пытается манипулировать? .. должен ли я прочитать его из строки запроса. – Mortalus

+0

Yeap, это то, что линия под ним - это чтение идентификатора объекта из RouteData или из запроса. Действия вашего контроллера должны каким-то образом передать эту информацию. –

+0

Я не думал, что могу получить доступ к данным маршрута, переопределяя атрибут ... Спасибо, что сработало отлично! :) – Mortalus

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