我需要能够根据 CRUD 的动态角色限制用户在我的应用中可以执行的操作。
例如,用户/索引需要[ClaimsAuthorize("View", "User")]
等身份验证[Authorise(Roles="Administrator")]
,以便我可以检查用户是否具有要查看的安全性。
我已配置用户角色,但用户可以使用的角色是动态角色。管理员可以使用复选框更改安全级别,这将使不同的安全组能够执行不同的操作。
主要问题是在 Razor 中执行此操作,我需要类似@User.CanEditUsers
的内容,但我不知道如何才能完成此操作。
任何帮助都会非常感激,因为我无法找到正确的方法来解决这个问题。
答案 0 :(得分:2)
您需要将角色的概念与设计中的组分开。
角色提供固定权限以在您的应用程序中执行某些操作。组是一组用户。管理员真正做的是将用户组分配给不同的角色。
您的授权码应该能够依赖固定的角色,例如: “ViewUserInfo”角色。然后实现管理界面,以便当admin允许用户查看userinfo时,将该用户添加到“ViewUserInfo”角色。
组也是如此:如果授予整个用户组查看用户信息的权限,则应将该组添加到“ViewUserInfo”角色。要介绍组的概念并能够将组添加到角色,您不能依赖标准的SimpleRoleProvider,因此您可能必须实现自己的角色提供程序以及组提供程序。
最后,一些解决方法可能会更容易,但在我看来,这是一个更清洁的架构。
答案 1 :(得分:2)
请注意,授权用户查看特定页面元素与授权CRUD或其他数据库操作不同,除非元素指向Controller中的操作操作。考虑到您可能有一些元素,不需要特定用户查看,也没有特定的数据库操作。到目前为止,我们得出结论,我们需要以下权限:
我相信你可以对这两个部分使用Microsoft Role Provider。根据MSDN文档考虑到:
Authorize属性允许您指明授权 限制为预定义角色或个人用户。这给了你 高度控制谁有权查看任何页面 该网站。
在下一步/问题是如何做到这一点?
我认为有三种方法可以满足我们的目的:
解决方案1:由于将每个用户转发到相关的视图,因此使用特定的页面元素创建单独的视图。在这种情况下,我们必须
也创建单独的控制器动作。我们必须检查用户类型
在每个动作之前,如[Authorise(Roles="Administrator")]
。我们
被迫拥有静态(预定义)角色和可访问性。并在
一句话由于冗余而不是一个好的解决方案
不稳定性强>
解决方案2 :动态创建页面只需为一页中的每个访问限制元素添加一些if
条件(适用于
示例编辑页面)。这就像使用@if
(User.IsInRole("Admin"))
授权特定用户并进行展示一样
相关的页面元素,如按钮。在Controller方面我们可以使用
由于添加动态,if
条件(而不是FilterAttribute
基于生成/添加的新角色的功能)和控制有效
对数据库的事务。虽然FilterAttribute
添加了一些伟大的功能主义者(如性能优化)。用一句话一个温和的解决方案。
解决方案3:像解决方案2一样,只需修复控制器问题
创建我们自己的自定义FilterAttribute以进行授权。那会的
继承自AuthorizeAttribute
并覆盖OnAuthorize
您需要的方法仅适用于操作。
例如:
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)]
Here是关于上述概念的完整示例。以下是创建动态AuthorizeAttribute
的完整示例,用于授权添加到应用程序的新角色。
解决方案3用一句话完美而复杂的解决方案。
请注意,在操作之前使用FilterAttribute
我们将应用程序限制为静态/预定义角色。无需使用其他数据结构或在数据库中生成表。
答案 2 :(得分:1)
从马的口中说:“角色管理可以帮助您管理授权,这使您可以指定允许应用程序中的用户访问的资源。角色管理允许您将用户组作为一个单元处理,方法是将用户分配给角色,例如作为经理,销售人员,会员等。“ (参考:http://msdn.microsoft.com/en-us/library/5k850zwb%28v=vs.100%29.aspx)
用户可以担任多个角色,您可以利用操作过滤器对您网站中各种资源的访问进行细粒度控制:
[Authorize(Roles="Contributor, Designer, Reviewer")]
我认为您所面临的“动态”方面围绕着管理员能够按需添加和删除用户,这些角色提供对这些资源的访问权限,这是非常典型的。
不断更改角色授予的权限的想法将是一个糟糕的设计选择。