14

我正在编写一个需要多种形式的身份验证的应用程序。

应用程序需要支持对 Active Directory 的身份验证,但如果用户不在 Active Directory 中,则能够故障回复到 SQL 成员资格提供程序。我们可以根据提供的用户名在代码中处理 SQL Provider 的失败,因为用户名的格式与 Active Directory 用户名的格式不同。

这甚至可能吗?我的意思是,我可以使用会员资格并同时使用 ActiveDirectoryMembershipProvider 和 SqlMembershipProvider 还是我必须自己推出?

另一个额外增加的复杂性是,我想根据 Windows 身份验证自动将我的内部用户身份验证回 AD,但对不在我们内部网络上的用户或使用 SQL 提供程序的用户使用表单身份验证。

这些很可能是单独的服务器,一个是内部的,另一个是外部的,所以我有很多计划要做来弄清楚数据复制,以及如果 AD 用户访问外部服务器等,我将如何对其进行身份验证。

当我开始走这条路时,我想知道那里有什么想法。如果我不自己动手,我想做的事情甚至可能吗,或者有没有办法将它们融合在一起?


谢谢回复。

我最初问的原因是因为我能够在大约 7 年前使用 IIS 进行身份验证,然后将凭据传递回 Lotus Domino 服务器 Web 应用程序,从而使这个特定的 senerio 工作。如果用户未通过 Windows 身份验证/ISS 进行身份验证,则 Domino 将处理身份验证。这就是我在这里想要做的,但真的想不出一种让它在 IIS 中工作的方法。

至于您的其余答复,我认为您正在走我需要采取的方式。我已经考虑过这一点,并在我的脑海中反复折腾。无论如何,两台服务器上的应用程序都会有所不同,因为无论如何访问外部服务器上的数据都会受到限制。事实上已经有很多不同了,我可能只是将它们视为两个应用程序,因此不需要在同一个应用程序中使用两种类型的身份验证。

我正在考虑为外部服务器编写自己的身份验证/登录窗口的想法,如果用户尝试在外部服务器上使用他们的 AD 凭据登录,我将能够检测到并将它们重定向到内部服务器。如果他们不在本地网络或 VPN 中,他们将根本无法访问。这部分仍然有一些思考过程,所以我不确定。

作为一个额外的想法 - 有没有办法将足够的 AD 提取到 SQL 数据库中,以允许我使用他们的 AD 凭据从外部服务器对 SQL 数据库的用户进行身份验证,而不会产生任何安全问题?我希望我清楚地输入我的想法......

再次感谢!

蒂姆

4

3 回答 3

8

这是我根据此信息处理类似情况的方式:

  1. 将应用程序配置为使用表单身份验证。
  2. 将 LoginUrl 设置为名为 WinLogin.aspx 的页面。
  3. 在 WinLogin.aspx 中,使用 Request.ServerVariables["LOGON_USER"] 获取用户名,然后调用 FormsAuthentication.RedirectFromLoginPage(authorizedUserName, false) 登录。我想您也可以手动检查 Active Directory。
  4. 创建一个重定向到名为 Login.aspx 的页面的 html 页面
  5. Login.aspx 是您的标准用户名/密码登录。
  6. 在 IIS 中,在整个站点上启用集成身份验证和匿名,但拒绝对 WinLogin.aspx 的匿名访问。
  7. 在 IIS 中,将 401 错误设置为在步骤 3 中创建的页面。

基本上发生的情况是,当未经身份验证的用户访问该站点时,他们会被重定向到 WinLogin.aspx。由于匿名已关闭,因此集成安全性会进行检查。如果通过,您在 WinLogin 中的自定义代码可以运行。如果集成安全检查失败,则会出现 401 错误。您的自定义 401 页面重定向到 Login.aspx,用户可以在其中使用 SQL 提供程序的用户名和密码登录。

于 2008-11-21T22:39:44.647 回答
2

据我所知,Web 应用程序配置为使用 Windows 身份验证或表单身份验证,但不能同时使用两者。因此,我认为在要求其他人输入用户名/密码的同时自动验证内部用户身份是不可能的。

您可以使用自定义提供程序通过表单身份验证对 Active Directory 或 SQL 用户存储进行身份验证。但是,AD 用户仍然需要输入他们的用户名和密码。尽管我从未将这两种方法结合使用,但我已经使用 Forms 身份验证一次或多次针对这两种来源进行身份验证。

话虽如此,我认为您可能需要考虑降低系统的“灵活性”。如果您有一个面向外部的服务器和一个面向内部的服务器,您可以简单地更改应用程序的每个副本上的提供程序配置以针对不同的源。然后,您可以将内部配置为使用 Windows(自动)身份验证,将外部配置配置为使用 Forms 身份验证。

恕我直言,我相信内部用户不应该使用外部服务器来访问应用程序。如果是,他们应该有一个存储在 SQL 中的用户帐户,与他们的 AD 帐户完全分开。基本上,当有人从外部访问应用程序时,他们充当的是外部用户,无论他们的物理位置如何。

于 2008-11-21T19:28:35.313 回答
2

好吧,可以使用 ActiveDirectoryMembershipProvider 和 SqlMembershipProvider,但这需要您使用自己的代码而不是登录控件来设计登录页面。

关于混合身份验证(Windows 和窗体),据我所知,只有 IIS 7 使它变得简单和干净。有关详细信息,请参阅此帖子,

http://mvolo.com/blogs/serverside/archive/2008/02/11/IIS-7.0-Two_2D00_Level-Authentication-with-Forms-Authentication-and-Windows-Authentication.aspx

于 2008-11-23T12:23:20.273 回答