Windows加入AD域后,想实现用登录计算机的AD域账号密码,登录各个web应用站点。即浏览器访问web站点时,不需要输入用户密码,自动使用登录windows系统时的AD账号登录。
官网地址:
https://apereo.github.io/cas/5.1.x/installation/SPNEGO-Authentication.html
AD域服务器上生成keytab文件
- 在AD域中,创建1个域账号,密码设置为永不过期
-
使用上面创建的域账号,创建SPN(服务主体名称)
使用administrator账户登录AD域控服务器,在命令行运行以下命令:
setspn -S HTTP/[email protected] loginName
参数说明:
cas.test.com:CAS服务器域名
apitest.domain.com:AD域服务器的域名
loginName:域登录账号
SPN:Kerberos身份验证使用SPN将服务实例与服务登录帐户相关联
-
生成keytab文件
使用administrator账户登录AD域服务器,在命令行运行以下命令:
ktpass /out cas.keytab /princ HTTP/[email protected] /pass * /mapuser [email protected]PITEST. DOMAIN.COM /ptype KRB5_NT_PRINCIPAL /crypto RC4-HMAC-NT
参数说明:
cas.keytab:生产的keytab文件名
cas.test.com:CAS服务器域名
APITEST.DOMAIN.COM:AD域服务器的域名(必须大写)
loginName:域登录账号
搭建Kerberos
认证原理
https://www.jianshu.com/p/fc2d2dbd510b
https://blog.csdn.net/wulantian/article/details/42418231
Kerberos和CAS需要安装在同一台服务器上,且该服务器必须有域名
- 解压缩安装包:krb5-1.17.tar.gz(Linux版Kerberos)
- 进入到安装包src目录下,编译安装
编译时可能会出现一些依赖错误,需要解决[email protected]# ./configure [email protected]# make && make install
- 修改Kerberos配置文件 /etc/krb5.conf
[logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] ticket_lifetime = 24000 default_realm = APITEST.DOMAIN.COM default_keytab_name = /root/cas.keytab dns_lookup_realm = true dns_lookup_kdc = true default_tkt_enctypes = rc4-hmac default_tgs_enctypes = rc4-hmac [realms] APITEST.PACTERA.COM = { kdc = apitest.domain.com:88 } [domain_realm] .apitest.pactera.com = APITEST.DOMAIN.COM apitest.pactera.com = APITEST.DOMAIN.COM
- 查看是否安装成功
klist -k Keytab name: FILE:/home/cas/kerberos/cas.keytab KVNO Principal ---- -------------------------------------------------------------------------- 3 HTTP/[email protected]
类似上面的结果,说明keytab文件能正常识别
注意:JDK bin目录里也有klist命令,会和Kerberos的命令冲突,建议到Kerberos安装目录下执行klist
搭建CAS
- 添加依赖
<dependency> <groupId>org.apereo.cas</groupId> <artifactId>cas-server-support-spnego-webflow</artifactId> <version>${cas.version}</version> </dependency> <dependency> <groupId>org.apereo.cas</groupId> <artifactId>cas-server-support-ldap</artifactId> <version>${cas.version}</version> </dependency>
- 添加配置
#如果在域环境中,使用域账户登录,免登 cas.authn.spnego.kerberosConf=/etc/krb5.conf cas.authn.spnego.jcifsServicePrincipal=HTTP/[email protected] cas.authn.spnego.loginConf=classpath:login.conf cas.authn.spnego.kerberosKdc=10.12.30.160 cas.authn.spnego.jcifsDomain=cas.test.com #cas服务器域名 cas.authn.spnego.kerberosDebug=true cas.authn.spnego.kerberosRealm=APITEST.DOMAIN.COM cas.authn.spnego.ntlm=false cas.authn.spnego.jcifsServicePassword=abcd-123 #生成keytab文件域账号的密码 #不是域用户,需要输入AD域账号密码登录 cas.authn.ldap[0].type=AUTHENTICATED cas.authn.ldap[0].ldapUrl=ldap://172.16.253.237:389 cas.authn.ldap[0].useSsl=false cas.authn.ldap[0].connectTimeout=5000 cas.authn.ldap[0].baseDn=DC=apitest,DC=domain,DC=com cas.authn.ldap[0].userFilter=(|(sAMAccountName={user})(mail={user})(mobile={user})) cas.authn.ldap[0].subtreeSearch=true cas.authn.ldap[0].bindDn=shiyonghui #域账号密码 cas.authn.ldap[0].bindCredential=abcd-123
- 添加配置文件login.conf,放到CAS classpath目录下
指定keytab文件的位置jcifs.spnego.initiate { com.sun.security.auth.module.Krb5LoginModule required storeKey=true useKeyTab=true keyTab="/root/cas.keytab"; }; jcifs.spnego.accept { com.sun.security.auth.module.Krb5LoginModule required storeKey=true useKeyTab=true keyTab="/root/cas.keytab"; };
浏览器配置
免密登录,需要浏览器开启windows身份验证。
IE开启windows身份验证
工具 - Internet选项 – 安全 – 自定义级别 – 自动使用当前用户名和密码登录

本地Intranet – 站点 – 高级 – 添加(CAS登录地址)
谷歌浏览器开启windows身份验证
IE开启后,谷歌浏览器也就开启了windows身份验证