【问题标题】:mixed mode authentication against AD and fallback to the database if it fail with Membership providers针对 AD 的混合模式身份验证,如果成员资格提供程序失败,则回退到数据库
【发布时间】:2026-02-05 08:00:02
【问题描述】:

我的用户将对 Active Directory 或数据库使用表单身份验证。那里没有 Windows 集成身份验证!

我想要的是当用户提交身份验证表单时,它将尝试针对 Active Directory 验证用户,如果失败,请尝试使用数据库。

我该怎么做?我的想法是构建一个自定义成员资格提供程序来封装逻辑,但我不知道如何开始。

有没有更好的办法?

【问题讨论】:

    标签: asp.net authentication asp.net-membership forms-authentication mixed-mode


    【解决方案1】:

    唯一的方法是创建自定义提供程序。

    在理想情况下,您可以简单地创建一个外观提供程序,然后根据需要利用适当的提供程序、SQL 或 AD 进行身份验证并将MembershipUser 返回到您认为必要的任何完整性程度。

    在现实世界中,这仍然是可能的,但您需要跳过几个环节:

    • 创建您的外观提供程序并将其first放在membership 元素的providers 子元素中,并将其设置为membership 元素中的defaultProvider
    • 正确配置SqlMembershipProviderActiveDirectoryMembershipProvider 并将它们放在您的外观之后。
    • 从您的外观,访问静态Membership.Providers 集合中配置的提供程序,以根据需要执行功能。

    如果你需要使用角色,你可能会发现你需要重复这个模式,虽然它适用,但实现会有点复杂,超出了本文的范围。

    或者,可以在here 找到 SQL 提供程序的完整源代码,这是实施工业级自定义提供程序的一个很好的起点和指导。

    我建议在尝试从头开始实施自定义安全功能之前,首先探索阻力最小(并且劳动和头痛最少)的路径并增加外观。

    祝你好运。

    【讨论】:

    • 我可能会尝试构建一个 WCF 服务来保存身份验证的所有逻辑(尝试使用 AD 并回退到数据库)。这样,所有应用程序将只有一个将调用我的 WCF 服务的 CustomMembershipProvider。有什么代码可以让我做到这一点吗?我确定我不是唯一需要为组织执行此操作的人:)
    • @alex - 今天稍后我会尝试花几分钟时间挖掘我的存储库并提取一些相关代码,特别是用于 AD 身份验证。它涉及一些pinvoke。不过,我不能保证什么。但是,如果您在您的服务上启用了 asp.net 兼容性,您应该能够使用上述策略来显着简化验证您的用户的过程。
    【解决方案2】:

    正如您所说,您最好创建一个自定义成员资格提供程序来处理这种情况。

    MSDN 很好地概述了创建自定义成员资格提供程序here 和一个很棒的example of an ODBC membership provider

    它应该会给你一个好的开始。

    【讨论】:

      最近更新 更多