2

对于给定的应用程序,我有一个由 C# 代码隐藏文件支持的 .aspx 登录表单。
在后面的代码中,我使用了以下“本土”方法:

private bool AuthenticateUser(String username, String password)
{
    bool validated = false;
    try
    {
        PrincipalContext pc = new PrincipalContext(ContextType.Domain, "domnet.domad.com", "dc=domnet,dc=domad,dc=com");
        IdentityType ADElement;
        UserPrincipal up;

        //Try first with no @DOM.COM - this should work for SamAccountName values:                 
        username = username.ToUpper().Replace("@DOM.COM", "");
        ADElement = IdentityType.SamAccountName;
        up = UserPrincipal.FindByIdentity(pc, ADElement, username);
        validated = pc.ValidateCredentials(username, password, ContextOptions.Negotiate);

        //If SamAccountName fails try UserPrincipalName with @DOM.COM
        if (!validated)
        {
            username = username + "@DOM.COM";
            ADElement = IdentityType.UserPrincipalName;
            up = UserPrincipal.FindByIdentity(pc, ADElement, username);
            validated = pc.ValidateCredentials(username, password, ContextOptions.Negotiate);
        }

        //Put username into session
        if (validated)
        {
            Session["Username"] = username.Replace("@DOM.COM", "");
        }
    }
    catch (Exception) //login failure...
    {
        validated = false;
    }

    return validated;
}

这适用于应用程序,但我还有其他需要身份验证的应用程序。
我真的不想将登录文件复制/粘贴到任何应用程序中。

所以我最基本的问题是我有哪些选择可以在应用程序之间集中验证代码?

将来,我还将关注:
不仅验证用户名/密码,还验证 AD 组成员身份。
一旦用户通过身份验证,应用程序之间就不再有登录屏幕。(单点登录)

在我看来,我不是第一个遇到这个问题的人。
如果可能的话,我更愿意使用开箱即用的解决方案而不是开发自己的解决方案。

4

5 回答 5

3

你可以:

于 2012-10-23T19:17:28.230 回答
2

一种方法是创建一个Core项目 (.dll/library),其中包含您希望在应用程序之间共享的公共部分,然后在您的应用程序中引用该项目。

即:假设您有 2 个应用程序:您将创建三个项目,A并且. 在项目 A 和 B 中,只需添加对核心库的项目引用。现在您可以从 A 和 B 访问核心中的任何方法。BABCore

这种方法适用于 SVN 和类似的版本控制系统,您会发现它是一种非常灵活的工作方式。困难的部分是确定什么是真正的通用代码并尽可能通用。

于 2012-10-23T19:14:44.460 回答
2

@Baxter不确定我的答案是否来得有点晚,因为几天前发布了这个问题,但我正在研究在我的 MVC 3 应用程序中实现集中式会话和身份验证管理的相同问题,我相信以下链接将是你很感兴趣:http: //www.codeproject.com/Articles/246631/ASP-NET-MVC3-Form-Authentication

与上述链接对应的文章的作者将身份验证功能分解为一个单独的 DLL,并使用依赖注入来使用应用程序上下文来利用外部“安全”DLL。我计划使用这种方法来集中安全机制并在 3 个不同的 MVC 3 Web 应用程序中重用它,所以它仍在研究中,并将根据我的发现相应地更新这个答案:)

于 2012-10-29T15:33:37.287 回答
1

您可以将此方法重构为一个单独的项目(意味着不同的 dll),并从您要使用此代码的任何 Web 应用程序中引用该项目。

于 2012-10-23T19:14:33.490 回答
0

如果您使用 Windows 身份验证,另一种方法是获取他们的 SID,查询 AD 以获取在 AD 和应用程序的用户表(我们使用电子邮件地址)之间共享的信息,并检查用户表是否有一个条目该电子邮件地址。

这样,通过登录到他们的工作站,他们基本上可以使用这种身份验证方法预先登录到任何应用程序。您只需确保在创建新用户帐户(在应用程序级别)时,您会捕获要检查身份验证的信息(这就是我们使用电子邮件地址的原因 - 每个人都知道他们的公司电子邮件)。

这与 Avada Kedavra 建议的核心库方法非常有效。此方法还允许您让每个应用程序维护自己的用户群(尽管它也可以很好地与中央用户数据库一起使用)。

于 2012-10-23T19:33:21.160 回答