请注意,授权用户查看特定页面元素与授权 CRUD 或其他数据库操作不同,除非这些元素指向 Controller 中的操作操作。考虑到您可能有一些特定用户不需要看到的元素,并且没有特定的数据库操作。到目前为止,我们得出结论,我们需要以下权限:
- 允许查看
- 指挥权
我相信您可以将Microsoft Role Provider用于这两个部分。根据 MSDN 文档,考虑到:
Authorize 属性允许您指示授权仅限于预定义的角色或单个用户。这使您可以高度控制谁有权查看网站上的任何页面。
在下一步/问题是如何做到这一点?
我认为有 3 种方法可以实现我们的目的:
解决方案 1:由于将每个用户转发到相关视图,因此创建具有特定页面元素的单独视图。在这种情况下,我们也必须创建单独的控制器动作。我们必须在每个操作之前检查用户类型,例如[Authorise(Roles="Administrator")]
. 我们被迫拥有静态(预定义)角色和可访问性。由于冗余和不稳定,一句话不是一个好的解决方案。
解决方案 2:动态创建页面,只需为One Pageif
中的每个访问受限元素添加一些条件(例如 Edit Page)。这就像使用授权特定用户并显示按钮等相关页面元素。在控制器端,我们可以使用
条件(不是由于基于生成/添加的新角色添加动态功能)并控制针对数据库的有效事务。尽管s 添加了一些很棒的功能主义者(例如性能优化)。一句话温和的解决方案。@if
(User.IsInRole("Admin"))
if
FilterAttribute
FilterAttribute
解决方案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完美但复杂的解决方案。
请注意,通过使用FilterAttribute
before Actions,我们将应用程序限制为静态/预定义角色。无需使用其他数据结构或在数据库中生成表。