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

时间:2010-06-27 15:22:26

标签: c# .net wcf-security legacy-code

我有以下情况:

  • 多个用户(< 100)
  • AD中的用户帐户(在不同的群组下)
  • AD中的每个小组都对应一个内部部门;每个部门至少有一名主管
  • (有人可能会说)我们有交叉监督(主管角色可以应用于小组,即可能有一位主管实际监督三人或小组 - 在AD中存在)
  • 多个内部系统,其中一半基于网络,所有这些都是通过.Net framework构建的

目前,我们有大多数基于桌面的系统按文件夹权限对用户进行身份验证(使用ClickOnce在网络环境中部署,每个部署文件夹由各个用户授权)。但这并不适用于所有桌面系统;我们有两个使用自己的嵌入式身份验证系统,如下所示:

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

  • 所有数据表实际上是同一数据的不同分组;此数据是指特定帐户。

  • 每个帐户行都包含{number,owner,type,data1,data2,data3,data4 ...}列;不同的分组基于数量/所有者/类型。

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

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

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

这个遗留系统即将由更新的系统取代;经过大量的考虑(包括可维护性 - 系统架构是一团糟),因为它只是用于最小化处理的数据检索和显示,所以我们决定使用(某些)查询并重新编写数据检索逻辑。

最重要的是,大多数现有的基于Web的系统都是硬编码许可的(if(sADLogin ==“userA”){..});其中一些只依赖于发送给特定用户和手指交叉的超非直观URL。悲伤。

我们希望使用更抽象的方法来获得权限(因此我们可以使每个系统都使用相同的身份验证提供程序)。使用Web服务/ WCF似乎是合适的(还考虑到我仍然必须验证基于桌面的系统和一些电子表格,可能使用标记);但是我找不到适合它的模式或架构模型。 Microsoft文档中有one WCF Intranet pattern解决了大部分问题 - 除了我不能将我的Windows组用作角色。然而,有一种互联网模式(http://msdn.microsoft.com/en-us/library/ff650091.aspx)似乎可以解决角色问题(这就是我现在要做的事情),但由于这是我第一次处理WCF安全问题,我希望有关于此事的一些专家意见。

有什么想法吗?

谢谢,

1 个答案:

答案 0 :(得分:0)

对于基于Web的应用程序,只需使用内置的ASP.NET提供程序模型单点登录到Active Directory即可解决此问题(请参阅:http://msdn.microsoft.com/en-us/library/aa478948.aspx)。您可以使用Active Directory进行身份验证,使用域组进行授权。有几种内置方法可以限制对页面的访问(使用web.config中的标签),访问页面的某些部分(使用)和访问代码(使用User.IsInRole()或RolePermission属性) - 一切都是自动的。对于网络,这是一种标准(互联网或内联网)。

对于非基于Web的应用程序,您实际上仍然可以使用相同提供程序模型的功能。您还可以非常轻松地在Active Directory中查找组成员身份。

如果您只需要了解某人所在的群组,那么您可能应该这样做。相反,你拥有的那个数据库表有一些更复杂的东西(比如授权授权),那么是的 - 你可能想要在它之前抛出一个WCF服务,让你所有的应用程序都使用它。但是,在ASP.NET的情况下,我仍然使用提供者模型,只编写我自己的RoleProvider,所以我仍然可以使用ASP.NET安全性的所有内置功能。希望有所帮助。

相关问题