Роли безопасности и разрешения ASP.NET

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

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

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

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


person AJM    schedule 14.05.2009    source источник


Ответы (5)


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

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

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

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

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

person Joe    schedule 14.05.2009
comment
Хотите, возможно, пойти по этому пути, получили сообщение в блоге о вашей реализации? :) - person Luke Hutton; 26.05.2011

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

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

person blowdart    schedule 14.05.2009
comment
Я думал об этом, но система, над которой я работаю, будет иметь много пользователей, поэтому клиент хочет иметь возможность настраивать предопределенные группы (например, роли) вместо того, чтобы устанавливать отдельные разрешения для групп пользователей за раз. . - person AJM; 14.05.2009

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

[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()
{

// ...

}
person ahaliav fox    schedule 14.11.2013

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

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

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

person dr.    schedule 16.10.2009

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

Взгляните на классы Roles и MemberShip в System.Web.Security

person PQW    schedule 14.05.2009
comment
Да, я знаком с ними. Однако я хочу, чтобы для каждой роли было несколько разрешений, связанных с этой ролью. - person AJM; 14.05.2009