如何在自定义SSO应用中通过ADFS对用户凭据进行认证?
我来帮你梳理下在自建SSO应用中对接ADFS完成用户凭据认证的关键步骤和常见问题解决思路:
自建SSO对接ADFS完成凭据认证的实现方案
1. 先搞定ADFS与SSO应用的信任基础配置
- 第一步得在ADFS服务器上给你的SSO应用创建信赖方信任:设置唯一的标识符(比如你的SSO应用域名),并配置允许访问的用户范围(比如全组织用户或指定组)。
- 接着在信赖方信任的「终结点」设置里,添加WS-Federation类型的终结点,地址填你的SSO应用用来接收ADFS认证断言的回调路径(比如
/adfs-auth-callback)。 - 导出ADFS的元数据文件(路径一般是
https://<你的ADFS域名>/FederationMetadata/2007-06/FederationMetadata.xml),在SSO应用里导入这个文件,确保能正确解析ADFS的公钥和各类端点信息。
2. 在SSO应用中发起ADFS的用户名密码认证请求
当用户在SSO登录页输入账号密码后,不要本地校验,而是直接调用ADFS的用户名密码认证端点(通常是https://<你的ADFS域名>/adfs/services/trust/13/usernamemixed)发起认证:
- 你可以用
Microsoft.IdentityModel.Protocols.WsFederation或System.IdentityModel.Services库来简化请求构造,示例代码大概是这样:
// 构造WS-Trust认证请求 var authRequest = new UsernamePasswordWsTrustRequestMessage( new Uri("https://<你的ADFS域名>/adfs/services/trust/13/usernamemixed"), "<你的SSO应用信赖方标识符>") { Username = inputUsername, Password = inputPassword }; // 创建通道并发起请求 var channelFactory = new WsTrustChannelFactory( new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), new EndpointAddress("https://<你的ADFS域名>/adfs/services/trust/13/usernamemixed")); channelFactory.Credentials.UserName.UserName = inputUsername; channelFactory.Credentials.UserName.Password = inputPassword; var channel = channelFactory.CreateChannel(); var securityToken = channel.Issue(authRequest) as GenericXmlSecurityToken;
3. 处理ADFS返回的令牌并完成SSO流程
- 首先验证ADFS返回令牌的签名:用之前导入的ADFS公钥校验,防止伪造令牌。
- 从令牌中提取用户的核心身份信息,比如UPN、角色、部门等。
- 在你的SSO应用中创建用户会话,然后生成针对
example.com的WS-Federation断言,最后重定向回example.com的Login Controller,完成整个单点登录流程。
4. 常见问题排查技巧
- 令牌验证失败:检查ADFS元数据是否正确导入,公钥是否匹配;确认信赖方信任的标识符和请求中传入的完全一致。
- ADFS拒绝认证请求:去ADFS服务器的事件日志里找线索(Windows事件查看器→应用程序和服务日志→AD FS→Admin),日志里会明确给出原因,比如密码错误、用户无访问权限、端点配置错误等。
- 回调路径不匹配:确保SSO应用的回调终结点和ADFS信赖方信任中配置的完全一致,包括HTTP/HTTPS协议和完整路径。
内容的提问来源于stack exchange,提问作者Aakesh Singh Tomar
相关产品推荐
相关产品推荐

