一、背景

微软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域单点登录架构图 ad域实现单点登录_windows-server

点击下一步下一步操作即可,具体操作方法也可以百度如何安装AD域服务;此处省

2、安装AD FS应用

配置AD FS时 服务器需要加入到AD域中

ad域单点登录架构图 ad域实现单点登录_SSL_02

安装之前先将申请好的SSL证书 安装在服务器上;应为在安装过程中需要使用SSL证书;

安装完成之后需要配置AD FS

ad域单点登录架构图 ad域实现单点登录_AD FS单点登录_03

1.配置向导,选择”在联合服务器场中创建第一个联合服务器“

ad域单点登录架构图 ad域实现单点登录_AD FS单点登录_04

2.配置账户用于连接域,注意,该账户需具有域管理员权限

ad域单点登录架构图 ad域实现单点登录_ADFS单点登录只需登录一次_05

3.指定服务属性,证书选择上一篇中创建并导入到“个人”中的通配符证书,名称修改一下,这里我修改为sts.domain.com的形式,联合服务器名称这里可以随意填写,后面会介绍如何对其进行修改。

ad域单点登录架构图 ad域实现单点登录_ad域单点登录架构图_06

ad域单点登录架构图 ad域实现单点登录_windows-server_07

ad域单点登录架构图 ad域实现单点登录_SSL_08

继续点击一下步就好了就完成了;

测试配置是否正常

  1. 打开浏览器窗口,在地址栏中键入联合身份验证服务名称,然后,在该名称的后面附加 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

ad域单点登录架构图 ad域实现单点登录_AD FS单点登录_09

如果看到右侧显示错误信息,如:

ad域单点登录架构图 ad域实现单点登录_SSL_10

验证错误,则需要配置:请按照:

https://docs.microsoft.com/zh-cn/windows-server/identity/ad-fs/troubleshooting/ad-fs-tshoot-initiatedsignon

进行配置,主要是设置:

ad域单点登录架构图 ad域实现单点登录_AD FS单点登录_11

设置之后验证 如果显示未登录则正常。继续往下走;

1、接下来要配置 创建信赖方信任

按照:https://docs.microsoft.com/zh-cn/windows-server/identity/ad-fs/operations/create-a-relying-party-trust 进行配置;

ad域单点登录架构图 ad域实现单点登录_AD FS单点登录_12

2、配置声明规则

请按照:https://docs.microsoft.com/zh-cn/windows-server/identity/ad-fs/operations/create-a-rule-to-send-ldap-attributes-as-claims 进行配置;

到这里就配置好了。接下来开发代码; 可查阅后面的文字信息,。

    这样便会显示 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域单点登录架构图 ad域实现单点登录_SSL_13

再重新登录浏览到 AD FS 登录页(联合身份验证服务名称后接 adfs/ls/idpinitiatedsignon.htm) 查看网页是否正常,正常的话往下走

接下来要配置信任方,可参考文章最下面的链接配置

6、打开VS2019 ,选择MVC,注意此处:

ad域单点登录架构图 ad域实现单点登录_ad域单点登录架构图_14

新建MVC项目后,只需要更改一个地方 web.config 

ad域单点登录架构图 ad域实现单点登录_ADFS单点登录只需登录一次_15

最后在应用服务器中打开应用地址如: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域单点登录架构图 ad域实现单点登录_AD FS单点登录_16

配置之后,就可以看到:

ad域单点登录架构图 ad域实现单点登录_SSL_17

这样关闭浏览器之后再打开也没有问题的。

ad域单点登录架构图 ad域实现单点登录_ad域单点登录架构图_18

具体的AD FS要求请查阅:

https://docs.microsoft.com/zh-cn/windows-server/identity/ad-fs/overview/ad-fs-requirements

安装部署地址文档:https://docs.microsoft.com/zh-cn/windows-server/identity/ad-fs/deployment/deploying-a-federation-server-farm

具体可参考官网:https://docs.microsoft.com/zh-cn/windows-server/identity/ad-fs/troubleshooting/ad-fs-tshoot-initiatedsignon

https://docs.microsoft.com/zh-cn/windows-server/identity/ad-fs/operations/ad-fs-single-sign-on-settings

配置信任方配置:https://docs.microsoft.com/zh-cn/windows-server/identity/ad-fs/operations/create-a-relying-party-trust

如果出现 “IIS DELETE,PUT请求,返回 405 - 不允许用于访问此页的 HTTP 谓词” 错误信息,请确保web.config 中的地址 与你打开的地址一莫一样。包含端口也要一样。