【问题标题】:Forms Authentication and Active Directory表单身份验证和 Active Directory
【发布时间】:2013-12-13 17:39:09
【问题描述】:

目前我有一些使用表单身份验证的项目,并且我可以让用户使用他们的 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);

我只是想知道是否有人知道正确执行此操作的方法或执行此操作的不同方法。任何建议都是有帮助的!谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 是的,我已经调查过了。上面说 var root 的代码是我得到空引用异常的地方。
    【解决方案2】:

    我已经解决了这个问题。我使用了我在问题中提供的链接以及 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 异常,这会找到用户当前所在的角色。确保您也在活动目录中使用组。希望这可以节省某人的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      相关资源
      最近更新 更多