Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#细粒度权限:多个内部系统、内部网场景_C#_.net_Wcf Security_Legacy Code - Fatal编程技术网

C#细粒度权限:多个内部系统、内部网场景

C#细粒度权限:多个内部系统、内部网场景,c#,.net,wcf-security,legacy-code,C#,.net,Wcf Security,Legacy Code,我有以下情况: 多用户(

我有以下情况:

  • 多用户(<100)
  • 广告中的用户帐户(在不同组下)
  • AD中的每个组对应一个内部部门;每个部门至少有一名主管
  • (有人可能会说)我们有交叉监督(存在适用于一组组的监督角色,即可能有一个监督实际监督三个或多个组的监督角色,正如AD中存在的那样)
  • 多个内部系统,其中一半是基于web的,都是通过.Net框架构建的
目前,我们有大多数基于桌面的系统通过文件夹权限对用户进行身份验证(使用ClickOnce在网络环境中部署,每个部署文件夹由单个用户授权)。但这并不适用于所有桌面系统;我们有两家公司使用自己的嵌入式认证系统,如下所示:

  • 系统A基本上由不同的数据表组成(只是在屏幕上显示一些数据)

  • 所有的数据表实际上是相同数据的不同分组;该数据指的是特定账户

  • 每个帐户行包含列{编号、所有者、类型、数据1、数据2、数据3、数据4…};不同的分组基于编号/所有者/类型

  • 所有数据(n)列都是数字(分组完成时显示每个分组的总和)

对于此特定系统,数据列归属于组。因此,AD Group1中的用户可以看到列数据(1-5),Group2可以看到列数据(7-9),依此类推。但是,每个组的主管可以看到其组的一个额外列(组1的主管可以看到数据(1-5)和数据6-让我们称之为组的“特殊列”);有些主管可以查看其他组列(包括或不包括“特殊列”),有些主管可以查看所有列,有些用户可以查看所有非特殊列。一团糟

为了解决这个问题,单击一次是不够的;因此,开发团队所做的基本上是嵌入一个特定的授权程序集,该程序集使用当前系统作为参数(它支持其他系统)查询数据库,并返回一组列名作为结果;然后,这些结果将用于另一个仅检索特定用户列的查询中

这个遗留系统即将被一个更新的系统所取代;经过大量考虑(包括可维护性-系统体系结构一团糟),因为它只涉及数据检索和显示,只需最少的处理,我们决定使用(部分)查询并重新编写数据检索逻辑

除此之外,大多数现有的基于web的系统都是硬代码许可的(if(sADLogin==“userA”){..});他们中的一些人仅仅依靠发送给特定用户的超非直观的URL,祈祷好运。悲哀

我们希望对权限使用更抽象的方法(因此我们可以使每个系统使用相同的身份验证提供程序)。使用web服务/WCF似乎很合适(还考虑到我仍然需要验证基于桌面的系统和一些电子表格,可能需要使用名字);然而,我找不到适合它的模式或架构模型。在微软的文档中,有一个问题可以解决大部分问题——除了我不能将我的Windows组用作角色之外。然而,有一种互联网模式()似乎可以解决角色问题(这就是我现在要讨论的),但由于这是我第一次处理WCF安全问题,我想就这一问题发表一些专家意见

有什么想法吗


谢谢,

对于基于web的应用程序,只需使用内置ASP.NET提供程序模型单次登录Active Directory即可解决此问题(请参阅:)。您可以使用Active Directory进行身份验证,使用域组进行授权。有几种内置的方法可以限制对页面的访问(使用web.config中的标记)、对页面某些部分的访问(使用)和对代码的访问(使用User.IsInRole()或RolePermission属性)——所有这些都是自动工作的。对于web,这是一种标准(internet或intranet)

对于非基于web的应用程序,实际上仍然可以使用同一提供者模型的功能。您还可以很容易地在Active Directory中查找组成员身份


如果你所需要的只是知道某人所在的群体,那么这可能就是你应该做的。相反,如果您拥有的数据库表有更复杂的内容(如委派授权),那么是的-您可能希望在前面抛出一个WCF服务,并让您的所有应用程序都使用它。然而,在ASP.NET的情况下,我仍然使用提供者模型,只需编写自己的RoleProvider,因此我仍然可以使用ASP.NET安全性的所有内置功能。希望能有所帮助。

Rob,谢谢你的回复。事实上,最后一种模式假设使用SQLServer成员资格提供程序;需要的两个定制是a)对成员资格提供商身份验证(我仍然希望根据广告业务合规性要求对用户进行身份验证,这样我就不会为用户提供另一组登录)和b)自定义角色提供程序,这样我就不必为2n个用户提供n个左右的角色。使用WCF路径实际上是一种公开身份验证服务的方法,而无需分发身份验证程序集、使用DCOM等。只是不确定这是否是一种方法-性能是一个问题,而且系统太异构(也就是说,对于windows环境)。由于没有找到任何合适的替代方案,所以正在按回答进行标记。我现在使用CustomRoleProvider。无论如何,谢谢。