2013-11-14 4 views
0

Предположим, у нас есть контроллер, чей маршрут Project/{ProjectID:int}/Page/{PageNumber:int} Этот контроллер управляет проектами, каждый из которых имеет ИНТ идентификатор, и каждый проект имеет 100 страницОграничение доступа к контроллерам MVC

Так проецировать 1, стр 33 будет доступен через:

http://localhost/project/1/page/33 

Я знаю, что могу защитить доступ к этому контроллеру, используя атрибут Authorize. Например, только «Прошедшие проверку» пользователи могут получить доступ к «проекту».

Каковы мои варианты защиты доступа к проектам? Например, у Билла есть доступ к проектам (1,2,3), поэтому он мог получить доступ к контроллеру выше, но как я могу предотвратить его доступ?

http://localhost/project/4/page/13 
+0

Это все равно может быть обработано «AuthorizationAttribute», однако этот уровень авторизации может быть лучше всего обработан на уровне домена. – James

ответ

2

Для строгого разрешения на уровне контроллера, AuthorizationAttribute это путь, но для авторизации ид более низкого уровня, я нашел лучший способ просто запрашивать только то, что действительно доступно пользователю.

В других случаях, если некий проект доступен только для конкретного пользователя (ей), то вы, несомненно, имеет свойство User (или аналогичные) на в Project модели (приравнивая к внешнему ключу на уровне базы данных). Поэтому использование этого: когда вы выборки проекта на основе идентификатора, добавить условие для пользователя, а также:

var project = db.Projects.SingleOrDefault(m => m.Id == id && HttpContext.Current.Identity.Name == m.User.Username) 
if (project == null) 
{ 
    return new HttpNotFoundResult(); 
} 

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

+0

+1 для меня это путь. Рассматриваемая проблема авторизации определенно больше уровня домена, чем уровень контроллера. – James

0

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

protected void Application_AuthorizeRequest(Object sender, EventArgs e) 
    { 
    string userName = Request.LogonUserIdentity.Name; // Bill 
    string page = Request.FilePath; // project/4/page/  
    if !(AuthorizeUtil.CheckAccess(page, userName) 
        Context.RewritePath("/AccessDenied");  

    } 
+0

Должен ли ОП угадать, что делает 'AuthorizeUtil'? Также 'Request.FilePath' не является надежным способом проверки пути, поскольку он не включает полный путь. – James

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