Обнаружение является пользователем является администратором (или любого типа) на странице, asp.net mvc поставщик членства по умолчанию - PullRequest
0 голосов
/ 10 ноября 2010

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

Я использую поставщика членства по умолчанию, но у меня есть таблица расширений под названием userFields, которую я использую для хранения пользовательских настроек.

Я только что добавил поле UserType в эту таблицу, и сейчас думаю о том, как будет лучше подобрать это на страницах.

Я действительно не хочу добавлять дополнительный код к каждому методу контроллера, чтобы получить эту информацию из БД и передать ее.

Есть ли лучший способ сделать это, используя настройки встроенных ролей в членстве asp.net, ИЛИ есть ли классный способ, которым я могу предоставить эту информацию из моей базы данных, так же, как работает user.identity.name или (User.Identity.Name) .ProviderUserKey;

Ответы [ 2 ]

1 голос
/ 10 ноября 2010

Пока вы используете стандартный метод аутентификации, который помещает объект пользователя в контекст, он не должен быть слишком сложным.По вашему мнению, используйте Html.RenderPartial и соответствующий контроллер, чтобы выполнить то, что вам нужно, как это ...

/ Home / Index View:

<div id="menu">
<ul>
<li>Page 1</li>
<li>Page 2</li>
<% Html.RenderPartial("/Home/AdminView"); %>
</ul>
</div>

/ Home / Admin View:

<li>Admin 1</li>
<li>Admin 2</li>

/ Общий / Пустой Просмотр:

<!--Empty view for non-viewable admin stuff-->

/ Домашний контроллер:

public ActionResult AdminView()
{
  //Check if user is admin
  //This should be your own logic... I usually have a few static methods that the 
  //Users or User object has to assist with checking
  if (Models.User.IsAdmin(HttpContext.User.Identity.Name))
  {
    return View();
  }
  else
  {
    return View("Empty");
  }
}

Это должно работать ... Это то, как я это делаю.Если это не так, надеюсь, кто-то умнее отправит лучший ответ, чтобы мы оба могли узнать

РЕДАКТИРОВАТЬ:

Просто подумал о чем-то другом ... Если ваш пользовательский объект реализует IPrincipalВы можете извлечь его из контекста, привести его к вашему типу пользователя и получить информацию прямо в классе пользователя ...

Вроде как

class User : IPrincipal
{
  //Implement IPrincipal stuff
  public string Role { get; set; }
}

Затем представление администраторалогика может выглядеть так:

public ActionResult AdminView()
{
  //Check if user is admin
  //This should be your own logic... I usually have a few static methods that the 
  //Users or User object has to assist with checking
  if ( ((Model.User)HttpContext.User).Role =="Admin" )
  {
    return View();
  }
  else
  {
    return View("Empty");
  }
}
1 голос
/ 10 ноября 2010

Используйте роли asp.net - тогда вы можете использовать атрибуты авторизации на своих контроллерах, чтобы убедиться, что у пользователя установлены соответствующие роли.

См. этот вопрос.

Это решает проблему обеспечения доступа к определенным пользователям только определенных действий / контроллеров.

Это не решает проблему того, чтобы сделать определенные функции «видимыми». Для этого вам нужно либо создать различные представления (или частичные представления), и ваш контроллер (ы) выбирает, какое представление следует визуализировать на основе ролей, либо вы пишете логику, специфичную для ролей, прямо в ваше представление.

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

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

...