我使用https://flask-ldap3-login.readthedocs.io/en/latest/quick_start.html#basic-application,它附带一个示例脚本,其中包含以下
# Hostname of your LDAP Server
app.config['LDAP_HOST'] = 'ad.mydomain.com'
# Base DN of your directory
app.config['LDAP_BASE_DN'] = 'dc=mydomain,dc=com'
# Users DN to be prepended to the Base DN
app.config['LDAP_USER_DN'] = 'ou=users'
# Groups DN to be prepended to the Base DN
app.config['LDAP_GROUP_DN'] = 'ou=groups'
# The RDN attribute for your user schema on LDAP
app.config['LDAP_USER_RDN_ATTR'] = 'cn'
我假设我可以通过运行nslookup -type=srv _ldap._tcp.mydomain.co.uk
并使用该值来获得app.config['LDAP_HOST']
,但我该如何处理其余的?
我已经运行了get-aduser jo.bloggs -Properties *
,但这给了我很多值,我不确定从哪里开始
任何建议吗?
感谢使用SRV记录是一个很好的方法——比假设"ad.example.com"要好得多。直接作为服务器使用。(即使该名称确实指向所有dc,您也不能使用TLS或Kerberos,因为两者都依赖于所提供的服务器的确切名称。)
请注意,目录服务器可以来也可以去,所以SRV查找的结果不应该硬编码在应用程序中。
app.config['LDAP_BASE_DN']
目录的基本DN(可以有多个)可以通过读取rootDSE条目来找到—一些LDAP库具有内置的功能,而在其他库中,您只需在空DN进行搜索例如,""
作为基础(BASE
作为搜索范围,这通常用于读取单个条目)。
在rootDSE条目中,namingContexts
属性将包含该服务器中所有分区的基本DNs,而defaultNamingContext
专门指向"primary"包含用户对象等的分区。
$ ldapsearch -x -b "" -s base * +
dn:
defaultNamingContext: DC=ad,DC=example,DC=com
namingContexts: DC=ad,DC=example,DC=com
namingContexts: DC=DomainDnsZones,DC=ad,DC=example,DC=com
namingContexts: DC=ForestDnsZones,DC=ad,DC=example,DC=com
对于Active Directory,您可以采取快捷方式并机械地从AD域名中生成DN,只需将每个DNS域组件转换为dc=
属性(例如,从您自己的示例中转换为dc=mydomain,dc=co,dc=uk
)。
(同样的方法并不能保证适用于其他LDAP目录,但是,因为根本不要求目录使用dc=作为基本条目—例如,使用o=Example Inc.
作为基本条目是完全有效的—因此您应该始终查看rootDSE以确保正确。)
app.config['LDAP_USER_DN'] = 'ou=users'
"附加到基本DN">高度取决于每个目录的管理方式。你必须查看目录的内容(例如,通过Apache directory Studio或至少通过dsa.msc)来了解布局。
目录也可能没有包含所有用户的单一公共分支,并且在根DN下直接创建多个ou或其他容器。在这种情况下,告诉Flask不要在这里添加,并在整个目录中执行用户搜索。
组也是如此;它们可能在一根树枝下,也可能分散在各处。
app.config['LDAP_USER_RDN_ATTR'] = 'cn'
"RDN"表示DN最左边的组成部分(如DC=ad
是DC=ad,DC=example,DC=com
的RDN)。ldap上用户架构的RDN属性;通常是CN
或uid
,并且在整个目录中通常是相同的,因此您可以通过查看您自己的用户帐户的LDAP条目的DN来确定它。(在Active Directory中,它实际上总是cn
)