最初发布于 StackOverflow,按照 SO 评论中的建议在此处交叉发布。
介绍
我需要用密码保护应用程序中的某些操作,例如加载/保存文件、单击复选框等。这是一个标准的 C# .Net 4.0、WinForms 应用程序,将在企业网络中的 Windows 7 上运行。
我正准备用一个包含用户/密码/权限(经过哈希和加盐)的文本文件来构建我自己的非常基本的系统(读取带有敞开后门的混淆),直到经过一番搜索,我发现了一个看起来像 极其简单的方法,但我找不到关于角色的好教程不是关于 ASP.NET。
问题
那么是否有人知道一个或多个教程可以向我展示如何:
- 创建一个 Windows 用户/组并授予该用户/组
Role
或权限。- 请注意,我正在通过我公司的联网笔记本电脑进行测试,但会将其部署在客户的公司网络上(不确定这是否是个问题,或者这会变得多么棘手)。
- 创建 winforms/console 应用程序示例,仅使用一种方法,如果我通过身份验证则打印“Hello World”,如果我未通过身份验证则引发异常?
- 我从未做过网络管理或任何相关的事情,我一直在阅读有关 Active Directory 和本地用户与网络用户的文章...我希望找到一种方法,可以构建一个
Interface
并询问 Windows 当前用户是否有权限ABC而不用太关心 Windows 如何解决这个问题。然后我可以根据需要为每个本地/网络/ActiveDirectory/等用例制定具体的实现(或如果需要...因为我现在甚至不知道)。
背景
- read if interested, but not required to answer question
为了确保我在这里的方向正确,基本上我需要/想要在我的开发电脑上测试它,以确保它能为我的客户提供良好的最终用户体验。问题是,目前他们为运行我的应用程序的每台计算机运行一个自动登录脚本,并且全天有几个不同的操作员使用我的应用程序。客户希望对我的应用程序的某些功能进行密码保护,并且只向某些操作员提供该保护。我对此没有问题,因为我已经期待这个请求一段时间了,只是我以前从未编写过身份验证程序。
我认为值得说服我的客户为每个操作员提供他们自己的网络帐户,并为该操作员或组分配他们想要的任何权限,以防他们需要解雇某人、更改权限等。这也意味着我只需为他们打开几个选项,他们可以根据公司内部政策对这些权限进行分组,我真的不必担心(但如果我必须自己动手的话,我就会担心,因为他们的 IT 部门对我的应用程序几乎一无所知)。
据我所知,它还使我的生活变得轻松很多,因为不必处理散列密码和加密等,而只需处理单击此按钮或那个按钮所需的角色。
答案1
我不知道当前在基于 .NET 的应用程序中执行授权的“最佳实践”方法是什么。这是我多年前在基于 Web 的应用程序中所做的事,我编写了该应用程序,将所有授权功能转移到操作系统本身。(这可能看起来像是一个狡猾的黑客,由一个首先是系统管理员,其次是开发人员的人编写。)
我列举了应用程序中的所有权限,并在目录层次结构中创建了文件,以便有选择地提供给分配了适当角色的用户。(这些文件不包含任何内容 - 正如您将在下面看到的,我只是检查了用户是否可以读取该文件。)
创建了识别应用程序用户角色的 Active Directory 组。
为 Active Directory 组分配了读取我在之前步骤中创建的文件的权限。
当用户通过应用程序(基于 Web)的身份验证时,会尝试访问每个“权限”文件。根据成功/失败,应用程序可以确定用户分配的“角色”。
对于客户的 IT 部门来说,改变应用程序的权限只需要更改“权限”文件上的 ACL(如果他们需要进行彻底的更改),或者更常见的是,只是更改用户组成员身份。
我喜欢这种方法,因为它能很好地处理所有“边缘情况”——嵌套组成员身份、来自外部森林的安全主体等。它也很好,因为如果将这些权限文件重新定位到 Windows Server 2012 机器上,我的应用程序就会突然“免费”获得新的动态访问控制功能。