【问题标题】:user roles and permission in mvcmvc中的用户角色和权限
【发布时间】:2015-05-28 17:44:33
【问题描述】:

我有一个 mvc 应用程序,其中我有不同的使用角色,并且角色用户具有不同的功能(例如:添加、编辑、删除,--),并且每个角色中的用户将具有此功能的子集在这个角色中。我想授予每个用户基于此权限查看页面的权限。

在 mvc 中实现这一目标的最佳方法是什么?

谢谢

【问题讨论】:

  • 你可以实现一个CustomMembershipProvider。通过这样做,您可以根据需要配置所有内容。您还可以使用数据库等中现有的用户表。
  • 出于某种原因,我们没有使用会员提供程序,我们将这些权限存储在数据库本身并在用户登录时加载。
  • 嗯.. 这听起来就像是 CustomMembershipProvider 机制与 CustomRoleProvider 的结合;-)

标签: c# asp.net-mvc


【解决方案1】:

在我们的应用程序中,我们有角色,每个角色都有许多功能。我们的目标是在功能级别而不是角色级别控制访问,尽可能减少对数据库的访问。

这是我们的工作:

1) 在登录时,我们创建一个 UserCredentials 对象,其中包含用户可以访问的所有功能(基于其角色)。它是用户有权访问的所有角色中包含的所有功能的“独特”。然后我们将这个 UserCredentials 存储在 session 中。

2)为了限制对控制器或动作的访问,我们实现了一个继承 AuthorizeAttribute 的属性,我们使用如下:

[Secure(Functionalities="Xyz.View,Xyz.Save")]
public ActionResult SomeAction(...){ ... }

请注意,没有数据库调用,我们所做的只是检查“Xyz.View”是否在存储在 UserCredentials 中的功能列表中。

3) 有时我们需要从操作内部访问凭据,因此我们创建了另一个 ActionFilter(全局),如果他找到名为“凭据”的参数,它将为您在操作参数中注入凭据,例如:

public ActionResult SomeAction(UserCredentials credentials, int otherParameters)
{
    // "credentials" is populated by the global action filter  
}

您可以使用它来根据用户角色或功能显示不同的视图。

4) 另一种情况是当我们需要根据用户角色或功能隐藏部分视图时。为此,我们创建了一个具有 UserCredentials 属性的 BaseViewModel。此属性还由另一个在执行操作后运行的全局 ActionFilter 填充。如果模型继承 BaseViewModel,则过滤器填充 UserCredentials 属性。我们可以这样做:

@if(Model.UserCredentials.IsInRole("X")){
    <div>Some content</div>
}

@if(Model.UserCredentials.HasAccessTo("Xyz.Save")){
    <button>Save</button>
}

希望对你有帮助。

【讨论】:

  • If the model inherits BaseViewModel... 你的意思是if the **view model** inherits BaseViewModel?为什么模型会从视图模型继承?
  • 谢谢。我不完全确定自己,所以我想知道我是否做错了!
猜你喜欢
  • 2017-10-13
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 2020-10-18
  • 2015-11-26
相关资源
最近更新 更多