2017-02-12 88 views
0

大多数文章/例子我发现就涉及限制访问使用角色特定的控制器,用于asp.net的MVC的访问权限,但我试图找出如何具体访问权限被分配给属于特定角色的用户。分配访问权限,角色在asp.net mvc的

我的情况是相当简单的,因为这需要在用户级别的访问权限是“职工”角色的唯一角色:

  • 管理员:访问所有功能。
  • 工作人员:访问特定功能。
  • 成员:无法访问特定功能。

理想情况下,我想实现类似于下面

@if (@User.IsInRole("IsAdmin") || (@User.IsInRole("IsStaff") && 
    @User.HasAccess("DownloadData")) 
{ 
    <a href='@Url.Action("DownloadData".... 
    </a>  
} 

我有一个单独的表在哪里存放员工的访问权限,并因为这些在用户级别分配的东西,我使用的AspNetUsers产生相同Id这么一个简单的EF/SQL LINQ的加入的确,当我登录到获得特定工作人员的有关访问权限的伎俩。

现在我的问题是:

  1. 我可以展开@user(校长)通过引入新的功能,例如有类似于上述的场景具有HasAccess在那里我可以通过访问权限需要检查具体工作人员。

  2. 1.如果不能完成,将通过右视图模型用于构建我的网页是一个可行的选择登录的用户访问?这太危险了吗?我错了,以为这应该是好的,因为这是基于服务器的代码,并不会传递到客户端?

  3. 如果1 & 2是不适合的,什么是最好的/推荐的方法来实现这一目标?

感谢

回答

0

最简单的方法是对IPrincipalIClaimsPrincipal创建一个扩展方法。这样您就可以将访问权定义统一在一个地方。如果您有很多访问权限检查,也许您需要将权限添加为声明(如果您使用声明)或以某种方式缓存它们,以便您不需要每次都访问数据库(如果它们存储在数据库中) 。

而且,你是对的,这是相同的,如果你传递的访问权限的视图,因为视图渲染到HTML。但是,恕我直言,第一个选择是好得多,因为你不需要通过访问权限检查混乱你的控制器。

+0

好吧,我会去研究选项1,看看有什么可以做的。如果你有任何兴趣的链接,你会介意发布它们。 – Thierry

+0

我在SO上发现了这个问题,并且很好地解释了如何扩展IPrincipal,但我仍然不确定如何使用它。我是否通过ApplicationUser替换ApplicationUser:IdentityUser:UserPrincipal其中UserPrincipal从IPrincipal继承? – Thierry

+0

在较新版本的ASP.NET MVC中,您不需要在使用声明时扩展Principal。您只需将您的访问权限添加为新的声明。另外,为了添加函数来检查访问权限,也许这足以创建一个扩展方法,而不是使用继承。 –

相关问题