2015-03-25 162 views
5

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

什么是最好的方式来实现这个在MVC?

谢谢

+0

您可以实现一个CustomMembershipProvider。通过这样做,您可以根据需要配置所有内容。您也可以在数据库中使用现有的用户表等。 – Robert 2015-03-25 06:49:54

+0

由于某些原因,我们并未使用成员资格提供程序,因此我们将这些权限存储在数据库本身中,并在用户登录时加载。 – 2015-03-25 06:56:34

+0

好吧..听起来就像一个CustomMembershipProvider机制结合CustomRoleProvider ;-) – Robert 2015-03-25 07:27:19

回答

10

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

这里是我们做什么:

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

2)限制访问控制器或动作,我们已经实现了继承AuthorizeAttribute一个属性,我们使用这样的:

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

注意,没有数据库调用,我们要做的是检查“ Xyz.View“位于存储在UserCredentials中的功能列表中。

3)有时我们需要从操作内部访问证书,所以我们已经创建了另一个ActionFilter(全局),例如,如果他找到名为“credentials”的参数,将为操作参数注入凭证:

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

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

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

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

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

我希望它能帮助。

+0

'如果模型继承BaseViewModel ...'你的意思是如果**视图模型**继承BaseViewModel'吗?为什么模型会继承视图模型? – Jeff 2017-08-22 16:15:22

+0

是的杰夫,你是对的,我的意思是观看模型。 – Auresco82 2017-08-23 18:14:41

+0

谢谢。我并不完全确定自己,所以我想知道我是否做错了事情! – Jeff 2017-08-23 18:22:00