ASP.NET Роли безопасности и разрешения - PullRequest
6 голосов
/ 14 мая 2009

Я доволен моделью безопасности ASP.NET, согласно которой можно разрешить / запретить доступ пользователям в web.config в зависимости от того, в каких ролях они находятся, например.

<system.web>
  <authorization>
    <allow roles = "Admin" />
  </authorization>
</system.web>

Однако я хочу предоставить пользователю с правами администратора набор разрешений, которые затем можно проверить, например, пользователь с правами администратора, например «может печатать документы», «может удалять документы»

Возможны ли такие вещи из коробки или мне нужно пойти по специальному маршруту?

Ответы [ 5 ]

4 голосов
/ 14 мая 2009

Вы можете использовать Azman, как описано в этой статье MSDN .

Но есть ряд вещей, которые мне не нравятся в Azman, поэтому я свернул свое собственное дополнение к RoleProvider (дополнительные таблицы, API и инструменты администратора, которые управляют сопоставлением разрешений ролям).

Моя пользовательская реализация очень проста:

  • M-N взаимосвязь между ролями и разрешениями.

  • API "HasPermission", который проверяет, есть ли у данного участника заданное разрешение. Это просто перебирает все роли и проверяет, есть ли у роли данное разрешение. Роли разрешений сопоставления кэшируются с использованием кэша ASP.NET по соображениям производительности.

2 голосов
/ 14 мая 2009

Это не из коробки; но если вы хотите быть более детализированными, почему бы не иметь гранулярные роли, такие как «CanPrint», «CanDelete», а не более широкие, такие как «Admin»?

Если им нужен сценарий типа контейнера, как вы указали в своих комментариях, вы можете установить собственный IPrincipal - где после аутентификации и при каждом новом запросе вы просматриваете членство пользователя в роли («Admin», «Public» и т. Д. ), а затем переопределите IsInRole на вашем IPrincipal. Вы можете найти пример здесь

1 голос
/ 14 ноября 2013

я нашел эту статью, которая дает хороший пример

[Flags]
public enum Permissions
{
View                 = (1 << 0),
Add                  = (1 << 1),
Edit                 = (1 << 2),
Delete               = (1 << 3),
Admin                = (View | Add | Edit | Delete)
}

public ActionResult Authenticate(string username, string password)
{
var user = authenticationService.Authenticate(username, password);
Session["User"] = user;

return RedirectToAction("Somewhere", "Else");  
}

public class PermissionsAttribute : ActionFilterAttribute
{
private readonly Permissions required;

public PermissionsAttribute(Permissions required)
{
    this.required = required;
}

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var user = filterContext.HttpContext.Session.GetUser();
    if (user == null)
    {
        //send them off to the login page
        var url = new UrlHelper(filterContext.RequestContext);
        var loginUrl = url.Content("~/Home/Login");
        filterContext.HttpContext.Response.Redirect(loginUrl, true);   
    }
    else
    {
        if (!user.HasPermissions(required))
        {
            throw new AuthenticationException("You do not have the necessary permission to perform this action");
        }
    }
}
}

[Permissions(Permissions.View)]
public ActionResult Index()
{

// ...

}
0 голосов
/ 16 октября 2009

Вы можете вернуть РАЗРЕШЕНИЯ вместо РОЛ в вашем RoleProvider.

public override string[] GetRolesForUser(string username) {
   return GetGrantedPermissions(userName);
}

Затем создайте свои страницы администратора, чтобы добавить (предоставленные / запрещенные) разрешения для ролей и, конечно, пользователей для ролей.

0 голосов
/ 14 мая 2009

Да, это возможно. Создайте нужные роли, добавьте пользователей к ролям, а затем просто отметьте User.IsInRole в своем коде, где вы выполняете действие, требующее этой роли.

Посмотрите на классы Roles и MemberShip в System.Web.Security

...