在应用程序之间集中验证代码

时间:2012-10-23 19:10:47

标签: c# asp.net authentication active-directory centralized

对于给定的应用程序,我有一个由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组成员资格                    用户通过身份验证后,不再在应用程序之间登录屏幕。 (SSO)

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

5 个答案:

答案 0 :(得分:3)

你可以:

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

这与Avada Kedavra建议的核心库方法非常吻合。此方法还允许您让每个应用程序维护自己的用户群(尽管它也适用于中央用户数据库)。