3

我需要能够根据CRUD的动态角色来限制用户可以在我的应用程序中执行的操作。

例如,用户/索引将需要诸如[ClaimsAuthorize("View", "User")]反对的身份验证,[Authorise(Roles="Administrator")]以便我可以检查用户是否具有查看的安全性。

我配置了用户角色,但角色使用户能够执行的操作是动态的。管理员可以使用复选框更改安全级别,使不同的安全组能够执行不同的操作。

主要问题是在Razor中执行此操作,我需要与 类似的东西@User.CanEditUsers,但我不知道如何才能做到这一点。

任何帮助将不胜感激,因为我无法找到正确的方法来解决这个问题。

4

3 回答 3

2

您需要在设计中将角色的概念与组分开。

角色授予在您的应用程序中执行某些操作的固定权限。组是一组用户。您的管理员真正在做的是将用户组分配给不同的角色。

您的授权代码应该能够依赖于固定角色,例如“ViewUserInfo”角色。然后实现管理界面,以便当管理员允许用户查看用户信息时,将该用户添加到“ViewUserInfo”角色。

组也是如此:如果授予整个用户组查看用户信息的权限,则应将该组添加到“ViewUserInfo”角色。要引入组的概念并能够将组添加到角色中,您不能依赖标准的 SimpleRoleProvider,因此您可能必须实现自己的角色提供者以及组提供者。

最后,一些解决方法可能会更容易,但在我看来,这是一个更干净的架构。

于 2013-08-19T11:18:08.537 回答
2

请注意,授权用户查看特定页面元素与授权 CRUD 或其他数据库操作不同,除非这些元素指向 Controller 中的操作操作。考虑到您可能有一些特定用户不需要看到的元素,并且没有特定的数据库操作。到目前为止,我们得出结论,我们需要以下权限:

  1. 允许查看
  2. 指挥权

我相信您可以将Microsoft Role Provider用于这两个部分。根据 MSDN 文档,考虑到:

Authorize 属性允许您指示授权仅限于预定义的角色或单个用户。这使您可以高度控制谁有权查看网站上的任何页面。

在下一步/问题是如何做到这一点?

我认为有 3 种方法可以实现我们的目的:

  • 解决方案 1:由于将每个用户转发到相关视图,因此创建具有特定页面元素的单独视图。在这种情况下,我们也必须创建单独的控制器动作。我们必须在每个操作之前检查用户类型,例如[Authorise(Roles="Administrator")]. 我们被迫拥有静态(预定义)角色和可访问性。由于冗余和不稳定,一句话不是一个好的解决方案。

  • 解决方案 2:动态创建页面,只需为One Pageif中的每个访问受限元素添加一些条件(例如 Edit Page)。这就像使用授权特定用户并显示按钮等相关页面元素。在控制器端,我们可以使用 条件(不是由于基于生成/添加的新角色添加动态功能)并控制针对数据库的有效事务。尽管s 添加了一些很棒的功能主义者(例如性能优化)。一句话温和的解决方案@if (User.IsInRole("Admin"))ifFilterAttributeFilterAttribute

  • 解决方案3:像解决方案2一样,通过创建我们自己的自定义FilterAttribute进行授权来解决控制器问题。这将继承AuthorizeAttribute并覆盖该OnAuthorize 方法以执行您只需要为 Operations 执行的操作

例如 :

public class TableAuthorizeAttribute : AuthorizeAttribute
{
    public enum TableAction
    {
        Read,
        Create,
        Update,
        Delete
    }
    public TableAction Action { get; set; }
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        //do custom authorizization using Action and getting TableEntryID 
        //from filterContext.HttpContext.Request.QueryString or
        //filterContext.HttpContext.Request.Form
    }
}

它的用法是这样的:

[TableAuthorize(Action=TableAuthorizeAttribute.TableAction.Update)]

是有关上述概念的完整示例。这是创建动态AuthorizeAttribute以授权添加到应用程序的新角色的完整示例。

一句话解决方案3完美但复杂的解决方案

请注意,通过使用FilterAttributebefore Actions,我们将应用程序限制为静态/预定义角色。无需使用其他数据结构或在数据库中生成表。

于 2013-10-25T23:09:19.177 回答
1

从马的口中:“角色管理帮助您管理授权,它使您可以指定允许应用程序中的用户访问的资源。角色管理通过将用户分配给诸如经理等角色,可以将用户组视为一个单元,销售、会员等。” (参考:http: //msdn.microsoft.com/en-us/library/5k850zwb%28v=vs.100%29.aspx

用户可以担任多个角色,您可以利用操作过滤器来细粒度地控制对站点中各种资源的访问:

 [Authorize(Roles="Contributor, Designer, Reviewer")]

我认为您所追求的“动态”方面围绕着管理员能够从提供对这些资源的访问权限的角色中按需添加和删除用户,这是非常典型的。

不断更改您的角色授予的权限的想法将是一个糟糕的设计选择。

于 2013-08-19T11:28:39.297 回答