Windows客户端Java富客户端对接STS的SSPI单点登录问题求助
Windows Java富客户端对接STS实现SSO问题排查
我在Windows客户端尝试用Java富客户端对接STS(安全令牌服务)实现真正的单点登录(SSO)。目前GSSAPI能正常工作,但必须先手动执行java kinit获取TGT(票据授予票据),而受Windows凭据安全策略限制,allowtgt-registry项已无法使用。
已验证可行的方案
- 浏览器(Firefox、Chrome、IE等)通过Negotiate授权头可正常实现SSO
- 手动执行
java kinit后,GSSAPI可正常工作
尝试后不可行的方案
- Apache WinHttpClient
- Waffle
关键交互流程
- 请求:
GET /adfs/ls/wia?client-request-id=UUID - 响应:
401 WWW-Authenticate: Negotiate和NTLM - 请求:携带
Authorization: Negotiate YIIMWw...头的GET /adfs/ls/wia?client-request-id=UUID - 响应:仍返回
401 WWW-Authenticate: Negotiate和NTLM
代码差异
我使用的Waffle代码(Apache WinHttpClient逻辑类似)与可行的GSSAPI方案仅存在以下差异:
String SECURITY_PACKAGE = "Negotiate"; byte[] token = WindowsSecurityContextImpl.getCurrent(SECURITY_PACKAGE, "HTTP/mystsserver.my.domain").getToken(); String ticket = Base64.getEncoder().encodeToString(token); String header = SECURITY_PACKAGE + " " + ticket;
GSS-API生成的票据与SSPI生成的票据开头一致、长度相同,但被IIS拒绝。
问题
- 如何针对此场景调试STS?
- 如何无需手动执行
kinit即可通过GSSAPI获取令牌? - 我在使用Waffle或WinHttpClient时存在哪些问题?
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

