1

Во время моих первых шагов в .NET MVC 4 Я создаю веб-сайт, и я хотел бы реализовать аутентификацию/авторизацию пользователей..net MVC 4 Авторизация (членство)

В моей реализации я хотел бы иметь возможность связывать элементы управления с ролями. Например, если у меня есть 2 Роли в моей системе: Администратор и пользователь, то в какой-то точки зрения у меня есть 3 входа:

  <input class="search-field rounded" id="field1" type="text"/> 
      <input type="submit" name="submit"/> 

      <input class="search-field rounded" id="field2" type="text"/> 
      <input type="submit" name="submit"/> 

      <input class="search-field rounded" id="field3" type="text"/> 
      <input type="submit" name="submit"/> 

Я хотел бы, что Администратор будет иметь возможность просматривать и редактировать все 3 поля это представление, но Пользователь должен видеть только 2 из них и иметь возможность редактировать один из них (это всего лишь пример).

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

Так что это мои ограничения, и я вижу довольно много пакетов (например, Fluent Security и Security Guard), которые относятся к теме, но я не совсем уверен, что лучше всего решить мою задачу, если вообще ,

Есть ли наилучшая практика для преодоления этого спроса?

Любая помощь очень ценится.

ответ

0

Я закончил создание собственного поставщика членства и поставщика роли.

В моей роли поставщика я добавил метод

public bool UserHasPermission(string username, string permission) {...} 

И на мой взгляд, я делаю:

@{ 
    var roleProvider = Roles.Provider as MyCustomRoleProvider; 
    bool addressEditPermission = roleProvider.UserHasPermission(User.Identity.Name, "addressEditPermission"); 
} 

Тогда я могу манипулировать мой контроль:

@Html.TextBoxFor(model => model.Name, new { @readonly = addressEditPermission }) 

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

Я надеюсь, что это поможет кому-то.

1

Я сделал это так:

//In Controller 
ViewBag.Roles = Roles.GetRolesForUser(User.Identity.Name);//viewbag because I'm assuming this isn't what you want to strongly type to your page. 

//In View 
@{ 
    var roles = (Roles)ViewBag.Roles; 
} 
if(roles.contains("admin')) //put whatever you want in place of "admin" 
{ 
    //do something 
} 

в контроллере вы можете дать доступ к определенному виду или частичному виду на этом пути // в контроллере, если вы хотите.
[Авторизовать (Roles = «Admin, ImportExport, Search»)] // это только для безопасности public ActionResult whatever() {} * Я использую бритву. замените @ на <%%> если нет.

+0

Спасибо, что ответили, но я не уверен, что я к тебе. Не могли бы вы рассказать о потоке, который использует код, который вы опубликовали? – forhas

2

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

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

return View(new ModelClass(HttpContext.User)) 

Здесь вы можете добавить дополнительный код в поле зрения логики для разбора/проверки роли и визуализации HTML с большей специфичностью, используя, например:

If (Model.User.IsInRole("Admin")) 
{ 
    //Render admin controls 
    //... 
} 
else 
{ 
    //Render User Controls 
    //... 
} 

Используя атрибут вашего метода действия [Authorize(Role="Admin||User")] ограничит доступ к целой группе пользователей. В таком случае вам понадобится два метода действий и один или, возможно, два разных представления для отображения содержимого. Однако, если вы просто хотите, чтобы ограничить его в любой авторизованный пользователь Вы можете сделать так:

[Authorize] 
    public ActionResult Index(){} 

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

+0

Итак, вы предлагаете мне передать текущую роль обратно в представление, тогда представление может решить, как сделать страницу соответствующим образом. Звучит интересно, я могу просто дать ему шанс и сообщить, работает ли он для меня. – forhas

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