让FreeRADIUS去掉登陆用户名中的Windows登录域
最近在上一篇StrongSwan+FreeRadius+IKEv2的文下面不少人问为何Windows Phone 8.1的客户端会登陆失败,实验了下发现由于WP的客户端发送的用户名是”Windows Phone\username
“的格式,而FreeRadius+MySQL不会处理这个用户名,因此Radius会拒绝认证。Windows自带的客户端如果不指定域的话没有这个问题。
试验了几种方法:
1)修改modules/mschap里面的with_ntdomain_hacks=yes
,并且安装samba(使用ntlm_auth认证):失败。mschapv2的with_ntdomain_hacks
可以去掉用户名中的域名,但是是在FreeRadius将原用户名(Windows Phone username)与sql比较之后,所以sql中找不到对应项,而samba上面也没有对应的Domain Controller所以会认证失败。
如果不使用NTLM,FreeRadius会提示[mschap] No Cleartext-Password configured. Cannot create LM-Password
,认证失败。
如果使用NTLM,winbindd会提示NT_STATUS_CANT_ACCESS_DOMAIN_INFO (0xc00000da)
,认证失败。
2)修改modules/preprocess里面的with_ntdomain_hacks=yes
,这样得到的用户名倒是正确的,但是由于User-Name和EAP-Identity里面的值不一,FreeRadius会提示[eap] Identity does not match User-Name, setting from EAP Identity
,认证失败。
所以最后还是得回到处理用户名的路上来。通过修改Stripped-User-Name
而非User-Name
的方法可以使认证成功,方法是在sites-enabled/default里面的authorize段里面添加,注意在chap之前:
# Stripping the NT domain name from user name
# Can't set with_ntdomain_hack in preprocess otherwise EAP will fail
# Use regex to remove domain name
if ( "%{User-Name}" =~ /^([^\\]\*)(\\\\\\\\)(.+)/ ) {
update request {
Stripped-User-Name := "%{2}"
}
}
通过正则表达式去掉用户名中的域部分。在WP8.1上测试成功。
注意这个仅在Freeradius 3.0.3及之前的版本适用,因为Freeradius 3.0.4修改了正则表达式的匹配方式。3.0.4里面正则表达式不是八个反斜杠而是四个。