Чтобы делать то, что вы хотите сделать, вам не нужно контролировать свои представления - на самом деле вы должны защищать свои контроллеры, а не представления.Вы можете сделать это через атрибуты контроллера.Что-то похожее на это:
[Authorize]
public class MyController {
}
Этим вы защищаете весь контроллер.Каждое действие в этом контроллере не будет отвечать, если пользователь не аутентифицирован (в частности, он получит ответ 401).Вы можете расширить это, авторизовав отдельных пользователей или отдельные роли, как показано в примерах ниже:
[Authorize(Users="eestein,JasCav")
public class MyController {
}
[Authorize(Roles="Administrator")]
public class MyController {
}
В вашем случае вы можете не захотеть иметь весь контроллер с авторизацией на нем.Что ж, достаточно превосходно, ASP.NET MVC обеспечивает контроль аутентификации на уровне действий.Итак, вы можете сделать это:
public class MyController {
public ActionResult Index() { }
[Authorize(Roles="Administrator")]
public ActionResult Admin() { }
}
Используя эту идею, вы можете контролировать то, что пользователь видит на странице.Вы захотите вернуть частичные страницы из ваших действий, чтобы вы могли загружать различные аспекты страницы.Например, у вас может быть представление, которое показывает некоторые нормальные данные и некоторые секретные данные.Нормальные данные могут быть возвращены через обычную страницу.Секретные данные должны быть возвращены как частичное представление на странице.Однако, если происходит 401, вы можете справиться с этим и просто ничего не показывать.
Это довольно просто сделать.Команда .NET отлично поработала над настройкой, и вам не нужно отдельно проверять разрешения в вашем контроллере.Я надеюсь, что это поможет вам начать.Выполните поиск в Интернете для получения дополнительной информации о том, как использовать атрибут авторизации.
Обновление В случае, если у вас есть администратор страницы, который контролирует эти разрешения, вы должны быть умнымио том, как вы устанавливаете свой атрибут Authorize.Именно здесь очень важны «роли» (согласно моим примерам выше).Например, если администратор скажет: «Я собираюсь добавить Джона Доу в роль SpecialUser», тогда пользователь Джона Доу сможет получить доступ ко всем действиям, для которых установлена роль SpecialUser (если это действительно так.роль в вашей системе).
Очевидно, что вам придется предоставить администраторам некоторый способ сделать это, и атрибут Authorize делает это отлично.Чтобы увидеть, у кого есть разрешения на странице, вам нужно будет запросить базу данных, чтобы узнать, кто является частью какой роли.Вот способ подумать о настройке:
- Вы управляете ролями действий.
- Ваши администраторы контролируют, кому предоставлены эти роли.
- Вы можетевсегда проверяйте (с помощью простого запроса), чтобы увидеть, кому назначена какая роль.Затем вы можете (благодаря вашему знанию ролей действий) увидеть, кто видит какую часть сайта.
Надеюсь, это прояснится (и, надеюсь, я достаточно хорошо понял вашу проблему).Я думаю, что то, что вы пытаетесь сделать, возможно.
Обновление 2 Да, это предполагает, что у вас есть статические группы на контроллерах, и любая новая группа должна быть добавлена программно.Мне было бы любопытно узнать, какой вариант использования требует создания разных типов разрешений на лету - кажется, что он может быть открыт для злоупотреблений.В любом случае у меня нет решения для этого.
Что касается того, как работают частичные представления ... это что-то вроде этого ...
public class ProductController : Controller
{
//
// GET: /Index/
public ActionResult Index()
{
return View();
}
public ActionResult Partial1()
{
return PartialView();
}
[Authorize]
public ActionResult Partial2()
{
return PartialView();
}
}
Внутри вашего Index.aspxфайл, у вас будет что-то вроде этого:
<%= Html.RenderAction("Partial1") %>
<%= Html.RenderAction("Partial2") %>
Если пользователь не авторизован, вы можете обработать второй RenderAction
, так что представление даже не отображается.(Вы можете проверить это в своем контроллере.)
Надеюсь, это прояснит ситуацию!Я нахожусь в бегах, поэтому я не могу больше на этом разбираться.