我正在使用具有以下配置的Active Directory成员资格提供程序:
<connectionStrings>
<add name="MyConnString" connectionString="LDAP://domaincontroller/OU=Product Users,DC=my,DC=domain,DC=com" />
</connectionStrings>
<membership defaultProvider="MyProvider">
<providers>
<clear />
<add name="MyProvider" connectionStringName="MyConnString"
connectionUsername="my.domain.com\service_account"
connectionPassword="biguglypassword"
type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</membership>
这完全有效,除非它要求我的所有用户都在“产品用户”OU中,而我实际上希望将所有用户组织到我们的“产品用户”OU下的各种子OU中。这可能吗?
(请注意,这是this question的部分重新发布,但我在这里问的问题从未在那里得到解答。)
答案 0 :(得分:1)
针对AD的身份验证是基于连接范围完成的,因为我无法解决它。 基本上这意味着连接字符串的上下文中的每一个都被认为是......
如果您的连接为:
LDAP:// domaincontroller / OU =域用户,DC =我,DC =域,DC = com
然后将对任何用户进行身份验证,即域的成员。
从那里你应该添加基于Windows令牌的角色提供程序并将其配置为这样......
<!-- use windows authentication -->
<authentication mode="Windows" />
<!-- use the Windows role provider -->
<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider" />
<!-- global authorization rules -->
<authorization>
<allow roles="Domain Admins, Product Users"/>
<deny users="*" />
</authorization>
这会锁定应用程序,仅供OU“产品用户”中的域管理员和用户及其所有子项递归使用。
从那里你可以对其他功能进行进一步的“基于上下文”检查,例如...
If(User.IsInRole("Product Admins"))
{
// do something groovy
}
else
throw new SecurityException();
这是什么意思......
这意味着您可以根据域用户组成员身份对应用程序逻辑的安全性进行细粒度控制,如果用户在您的域中,则会对其进行身份验证,但可能不对其进行授权(这取决于您的角色提供程序配置) )。
验证:识别用户。
授权:授予用户权限/访问权限。