一、背景
微软Active Directory域 (简称:AD域),通过C#实现AD域免登录;可采用ActiveX 获取当前登录的域用户名、或使用windows 身份验证来获取当前域用户名。根据获取到的域用户名 再与系统中用户进行关联进行登录;
以上方式可以实现免登录(只需要登录一次,后续自动登录),但都是依赖于IE浏览器。由于IE浏览器已不在维护升级,那如何实现AD域 单点登录呢。
可以采用Active Directory Federation Services AD FS来实现单点登录,AD FS其实就是解决SSO单点登录的问题。
二、AD FS描述
Active Directory 联合身份验证服务 (AD FS) 可跨安全和企业边界安全地共享数字标识和权利权限,从而实现联合身份和访问管理。 AD FS 扩展了使用单个安全或企业边界内提供给面向 Internet 的应用程序的单一登录功能的功能,使客户、合作伙伴和供应商可以在访问组织中基于 web 的应用程序时简化用户体验。
三、AD FS要求
应用程序域名必须使用https协议,即需要SSL证书。如果公司的主域名为 w.aaa.com; 多个应用程序使用二级域名如
a.aaa.com; b.aaa.com; c.aaa.com.
建议申请SSL证书时,要申请通配符类的证书 *.aaa.com 这样二级域名类的应用程序就可以不需要跨域 能自动登录;
具体的AD FS要求请查阅:请查阅文章底部
四、部署
1、首先需要安装好 AD域,再安装ADFS;
本文只针对需要注意的地方进行强调。具体安装文档请查阅底部链接
点击下一步下一步操作即可,具体操作方法也可以百度如何安装AD域服务;此处省
2、安装AD FS应用
配置AD FS时 服务器需要加入到AD域中
安装之前先将申请好的SSL证书 安装在服务器上;应为在安装过程中需要使用SSL证书;
安装完成之后需要配置AD FS
1.配置向导,选择”在联合服务器场中创建第一个联合服务器“
2.配置账户用于连接域,注意,该账户需具有域管理员权限
3.指定服务属性,证书选择上一篇中创建并导入到“个人”中的通配符证书,名称修改一下,这里我修改为sts.domain.com的形式,联合服务器名称这里可以随意填写,后面会介绍如何对其进行修改。
继续点击一下步就好了就完成了;
测试配置是否正常
- 打开浏览器窗口,在地址栏中键入联合身份验证服务名称,然后,在该名称的后面附加 federationmetadata/2007-06/federationmetadata.xml,以浏览到联合身份验证服务元数据终结点。例如:
https://fs.contoso.com/federationmetadata/2007-06/federationmetadata.xml
你应该会看到联合服务器元数据。 如果你尚未将 SSL 证书的根 CA 证书导入到客户端计算机上由本地计算机信任的根证书存储中,则可能会看到 SSL 错误或警告。
2.也可以浏览到 AD FS 登录页(联合身份验证服务名称后接 adfs/ls/idpinitiatedsignon.htm)。例如:
https://fs.contoso.com/adfs/ls/idpinitiatedsignon.htm
如果看到右侧显示错误信息,如:
验证错误,则需要配置:请按照:
进行配置,主要是设置:
设置之后验证 如果显示未登录则正常。继续往下走;
1、接下来要配置 创建信赖方信任
2、配置声明规则
到这里就配置好了。接下来开发代码; 可查阅后面的文字信息,。
这样便会显示 AD FS 登录页,你可以在其中使用域管理员凭据登录。
原来使用AD域 通过activex 来实现获取域用户名,通过域用户名与系统的关联关系自动登录。(只能在IE上使用)
后来使用ad域windows身份验证来实现获取域用户名。(IE不自动更新,退出市场)
再使用Active Directory Federation Services AD FS来实现单点登录
1、安装好AD域、安装好ADFS ;
2、配置ADFS,可参考:实战:ADFS3.0单点登录系列-总览
3、配置ADFS 过程中需要使用SSL证书,局域网需要自己生成SSL证书。注意申请证书请使用通配符 如*.hr.com 。因为配置adfs需要一个域名、应用需要域名;局域网生成SSL证书如下:【如果是正式环境申请 *.域名.com的SSL证书即可】
下载 mkcert-v1.4.2-windows-amd64.exe
打开CMD ,转到下载目录
再输入 mkcert-v1.4.2-windows-amd64.exe -install
mkcert-v1.4.2-windows-amd64.exe 127.0.0.1 localhost //后面还可以继续空格添加其他域名或IP地址,默认是pem格式
mkcert-v1.4.2-windows-amd64.exe -pkcs12 192.168.10.123 //生成p12格式的正式iis可以用,默认密码为:“changeit”
mkcert-v1.4.2-windows-amd64.exe -client 192.168.10.123 //客户端证书,默认是pem格式
mkcert-v1.4.2-windows-amd64.exe -pkcs12 -client 192.168.10.123 //生成p12格式客户端证书,win用户可以直接导入,默认密码为:“changeit”
如生成通符域名证书请使用mkcert-v1.4.2-windows-amd64.exe -pkcs12 *.hr.com
然后找到生成的证书,安装好。
4、配置好AD FS后,需要验证两步
1、打开浏览器窗口,在地址栏中键入联合身份验证服务名称,然后,在该名称的后面附加 federationmetadata/2007-06/federationmetadata.xml,以浏览到联合身份验证服务元数据终结点。例如:
https://fs.hr.com/federationmetadata/2007-06/federationmetadata.xml
你应该会看到联合服务器元数据。 如果你尚未将 SSL 证书的根 CA 证书导入到客户端计算机上由本地计算机信任的根证书存储中,则可能会看到 SSL 错误或警告。
2、浏览到 AD FS 登录页(联合身份验证服务名称后接 adfs/ls/idpinitiatedsignon.htm)。例如:
https://fs.hr.com/adfs/ls/idpinitiatedsignon.htm
这样便会显示 AD FS 登录页,你可以在其中使用域管理员凭据登录。
发现没有登录界面,请参考如下配置:https://docs.microsoft.com/zh-cn/windows-server/identity/ad-fs/troubleshooting/ad-fs-tshoot-initiatedsignon
再重新登录浏览到 AD FS 登录页(联合身份验证服务名称后接 adfs/ls/idpinitiatedsignon.htm) 查看网页是否正常,正常的话往下走
接下来要配置信任方,可参考文章最下面的链接配置
6、打开VS2019 ,选择MVC,注意此处:
新建MVC项目后,只需要更改一个地方 web.config
最后在应用服务器中打开应用地址如:https://localhost:44315/, 此时没登录的情况下会跳转到 AD FS的登录界面。
如果关闭浏览器后 又转到了ADFS登录界面,请设置AD FS的配置 请按照这个配置
https://docs.microsoft.com/zh-cn/windows-server/identity/ad-fs/operations/ad-fs-single-sign-on-settings 主要是下面的截图配置;
配置之后,就可以看到:
这样关闭浏览器之后再打开也没有问题的。
具体的AD FS要求请查阅:
https://docs.microsoft.com/zh-cn/windows-server/identity/ad-fs/overview/ad-fs-requirements
如果出现 “IIS DELETE,PUT请求,返回 405 - 不允许用于访问此页的 HTTP 谓词” 错误信息,请确保web.config 中的地址 与你打开的地址一莫一样。包含端口也要一样。