表单身份验证和Active Directory

时间:2013-12-13 17:39:10

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

目前我有一些使用表单身份验证的项目,我可以让用户使用他们的AD帐户登录。我一直这样做的方式非常简单。

的web.config

//first I set up the connection string to the active directory account
<connectionStrings>
    <add name="ADService" connectionString="LDAP://ourDomainController/OU=stores,DC=DOMAIN,DC=net" />
<ConnectionStrings>

//Then I add the membership provider for active directory
<membership defaultProvider="AspNetActiveDirectoryMembershipProvider">
      <providers>
        <clear />
        <!--Membership provider for Active Directory-->
        <add name="AspNetActiveDirectoryMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider,  System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADService" attributeMapUsername="sAMAccountName" />
      </providers>
</membership>

我无法使用Active Directory用户名和密码登录。但是,我无法拒绝访问特定群组的网站的某些部分。这样就可以搜索整个活动目录,如果你是它的一部分,你就可以登录。在一个应用程序中,我会将用户插入一个SQL表,然后授予用户访问该网站的权限,如果它们是一部分的话的SQL表。这很好用,但是,许多用户的应用程序正在快速增长,我想利用Active Directory中的组。我花了几天的时间研究和试验,但我找不到任何解决方案。许多人已经使用了Windows身份验证,但它的视觉吸引力较低,在这个阶段,可能会让最终用户感到震惊几周。 (该应用程序分布在13个不同的商店)我也调查了这个article ...并且在测试应用程序中尝试了这个解决方案,但没有任何运气。继续在自定义ADRoleProvider中收到错误提示“对象引用未设置为对象的实例”。

var root = new DirectoryEntry(WebConfigurationManager.ConnectionStrings[ConnectionStringName].ConnectionString, ConnectionUsername, ConnectionPassword);

我只是想知道是否有人知道如何正确地执行此操作或以其他方式执行此操作。任何建议都有帮助!谢谢!

2 个答案:

答案 0 :(得分:0)

AD角色提供者的理想方式您可以在链接后编写自己的角色提供者我解决您的问题Role Provider Link

答案 1 :(得分:0)

我已经解决了这个问题。我使用了我在问题中提供的链接以及Kamlesh提供的链接。问题是我的.. GetRolesForUser。我不得不用这段代码解决这个问题..

public override string[] GetRolesForUser(string username)
    {
        List<string> allRoles = new List<string>();
        var ctx = new PrincipalContext(ContextType.Domain);
        UserPrincipal user = UserPrincipal.FindByIdentity(ctx, username);
        if (user != null)
        {
            var groups = user.GetGroups();
            allRoles.AddRange(groups.Select(x => x.Name));
        }

        return allRoles.ToArray();
    }

我不再获取NullReferenceException并找到当前使用的角色。确保您也在使用Active Directory中的Groups。希望这可以节省某人的时间。