Freeradius 3对接Active Directory:如何支持UPN登录方式?
解决Freeradius 3.0支持UPN格式登录并提取CN用于认证的问题
核心问题分析
你已经通过LDAP过滤器成功匹配到UPN对应的用户DN,但MSCHAP认证需要正确的用户标识(如CN或sAMAccountName)而非原始UPN,因此需要在认证流程中提取并替换用户名。
步骤1:配置LDAP模块返回用户属性
修改mods-available/ldap配置文件,添加需要提取的用户属性,确保LDAP查询后能获取到CN等关键值:
ldap { # 保留原有其他配置 # 指定要返回的AD用户属性 attributes = cn, sAMAccountName, userPrincipalName # 你的原有过滤器保持不变 filter = "(|(cn=%{Stripped-User-Name})(userPrincipalName=%{User-Name}))" }
修改后执行命令启用配置:
ln -s /etc/freeradius/3.0/mods-available/ldap /etc/freeradius/3.0/mods-enabled/
步骤2:在Authorize阶段替换用户名
在sites-available/default和sites-available/inner-tunnel的authorize段中,添加逻辑:当通过UPN匹配到用户后,将认证用的用户名替换为CN,确保MSCHAP能正确对接AD:
authorize { # 保留原有模块(如eap、ldap等) ldap # 提取CN并替换认证用户名 if (&LDAP-CN && (&User-Name !~ /^%{LDAP-CN}@/)) { update request { # 将无域名的纯用户名设置为CN Stripped-User-Name := "%{LDAP-CN}" # 将完整用户名设置为CN@域名,保持格式一致 User-Name := "%{LDAP-CN}@%{Realm}" } } # 可选:若AD更适配sAMAccountName,可替换为以下逻辑 # if (&LDAP-sAMAccountName && (&User-Name !~ /^%{LDAP-sAMAccountName}@/)) { # update request { # Stripped-User-Name := "%{LDAP-sAMAccountName}" # User-Name := "%{LDAP-sAMAccountName}@%{Realm}" # } # } }
步骤3:验证配置并调试
- 重启Freeradius服务:
systemctl restart freeradius
- 开启调试模式查看流程:
radiusd -X
- 使用UPN格式登录,观察日志中
authorize阶段后,Stripped-User-Name和User-Name是否被替换为正确的CN值,同时确认MSCHAP认证环节是否正常通过。
内容的提问来源于stack exchange,提问作者Jim Björklund
相关产品推荐
相关产品推荐

