6

这是我的情况...

我正在为需要单点登录过程的大量 Web 应用程序编写一个 .Net/C# 安全系统(授权和身份验证)。我使用 Active Directory 作为数据存储,并编写了一个非常好的原型,通过 LDAP 与 AD 进行通信。该组件检索我存储在 AD 中的登录用户信息,然后我使用这些信息在 .Net 表单身份验证中设置他们的安全角色。

1)一切都很好。

作为系统管理员或网络工程师,我不熟悉设置 AD 实例所涉及的系统管理量。我不知道对于每个域,我都需要一个单独的服务器和域控制器。事实证明,我的团队需要为我们将要访问 AD 的所有不同环境设置 9 个不同的域……

  • env1.dev.mycompany.com
  • env1.qa.mycompany.com
  • env1.stage.mycompany.com
  • env2.dev.mycompany.com
  • ETC

...所以现在我给自己带来了一些管理上的头疼,因为我将不得不维护所有这些机器(或 VM),这是我不一定确定我想要做的事情。

2)一切都不好。

原型非常可靠,AD 为解决方案提供了一个非常好的数据库,但现在我想知道我是否应该放弃代码并改为编写 SQL Server 数据提供程序(我知道 .Net 已经提供了一个,但它没有'不仅符合我对授权的业务要求)。

无论如何,所以我试图从高层次的角度来思考这个问题。一般来说,我总是因为一些服务器维护而抛出一个非常好的解决方案这一事实而绊倒?我想知道这里是否有人经历过这样的场景以及你决定做什么。

也不必特定于 AD,只是您必须在一个好的软件解决方案和它的服务器维护限制之间进行评估的情况。

4

4 回答 4

4

一般来说,产品的可用性是人们在它和类似产品之间进行选择的原因。如果产品的可用性很差,用户就不会关心它的代码质量有多高——对他们来说,重要的是它的易用性和有效性以及它是否能很好地满足他们的需求。

维护可以被认为是可用性的一个方面。我会把拥有易于维护的产品作为首要任务。从长远来看,这将节省管理员的大量工作时间。

一种思考方式是,首先从最终用户/管理员的角度设计最有用的解决方案,然后让实际实施该最佳解决方案成为一项智力挑战。这可能需要程序员付出更多的努力,但最终结果会更好。

例如, ZFS是一款维护得很好的产品(尽管我没有亲自使用过)。在设计它时,投入了大量精力来简化使用 ZFS 的命令行工具来管理文件系统 - 这些设计决策会影响 ZFS 的所有级别(例如存储池)。

作为另一个例子,我最近一直在计划如何在我的未来项目中进行维护 - 分布式数据库和应用程序服务器。思考典型的管理任务将如何发生(安装/升级应用程序、在集群中添加/删除服务器、解决硬件故障等),帮助我理清了一些设计决策。其中一些深入到系统的架构中(例如,应用程序和扩展如何在运行时加载,以及服务器如何在集群中找到其他服务器)。

于 2009-04-22T22:49:42.717 回答
1

如果为 Windows 系统设置单点登录系统,我很可能会使用 AD。作为系统管理员。我尝试遵循单一数据源政策。AD 已经保存了我的大部分 Windows 用户/安全数据。我宁愿把所有东西都放在里面,而不是第二个系统。

在设置 dev/test/prod 环境时,我尝试确保与 Prod 环境紧密匹配,尤其是在正在开发的领域(正在投入开发工作等)。因此,如果设置系统来开发与 AD 的接口,我可能会有多个 AD 服务器。

哪些选项可以简化管理员?

您能否拥有 1 台以标准方式维护的主服务器,并使用 VMware 复制过程之类的东西来维护所有或大部分其他服务器?除了为支持开发/测试所做的更改外,不要对 9 台服务器做任何事情,而是将其他 8 台服务器保留为该镜像主服务器的副本?

您可以从 1 个 AD 服务器运行多个开发或测试域吗?

你可以编写动作脚本吗?

你能减少环境的数量,尤其是在测试的高端吗?例如,将多个开发环境和角色升级版本提供到一个测试环境中?

于 2009-04-22T22:39:58.370 回答
1

为什么在测试时不简单地使用 OU 而不是单独的域?也就是说,有一个域,但指定特定版本的用户必须在该域内的特定 OU 中找到。您要做的是在用于查找用户的搜索功能中,将特定的 OU 指定为搜索根目录,而不是域的根目录。在每个 OU 中,您可以拥有包含环境的 ID 以保持它们的唯一性,例如 , user_env1_dev, user_env2_dev, user_env1_qa...

我在我的应用程序中经常使用 AD,并且从不为开发/测试设置单独的域。

于 2009-04-22T22:41:10.427 回答
1

使用提供者模式并抽象您的数据源调用。

然后,您可以将其配置为动态使用 AD 或 SQL。

public abstract SSODataProvider {
     public bool AuthenticateUser(string u, string p);
}

public ADSSODataProvider : SSODataProvider {
    public override AutheticateUser(string u, string p) {
       //do auth here
    }
}

public SQLSSODataProvider : SSODataProvider {
    public override AuthenticateUser(String u, string p) {
      //call DB
    }
}

public static SSODataProvider dataProvider;

if (ConfigurationSettings.AppSettings["SSODataProvider"] == "SQL")
   dataProvider = new SQLSSODataProvider();
else
   dataProvider = new ADSSODataProvider();

....

dataProvider.AuthenticateUser("sss","sss");
于 2009-04-22T23:38:17.140 回答