【发布时间】:2015-12-11 15:32:41
【问题描述】:
我是 Kerberos 的新手,但我需要向 Web 应用程序提供 SSO Kerberos 身份验证。 我的应用程序流程如下所示:
1) 用户在 url 上进行 GET
2) 检查是否有授权,如果没有则 401 WWW-Authenticate: Negotiate
3) 使用标头创建 KerberosServiceRequestToken
4) 使用 SpringSecurity KerberosServiceAuthenticationProvider 它尝试验证,但我总是遇到异常:
org.springframework.security.authentication.BadCredentialsException: GSSContext name of the context initiator is null
SpringSecurity 中的配置:
public KerberosServiceAuthenticationProvider kerberosServiceAuthenticationProvider() {
KerberosServiceAuthenticationProvider provider = new KerberosServiceAuthenticationProvider();
provider.setTicketValidator(sunJaasKerberosTicketValidator());
return provider;
}
public SunJaasKerberosTicketValidator sunJaasKerberosTicketValidator() {
SunJaasKerberosTicketValidator validator = new SunJaasKerberosTicketValidator();
validator.setServicePrincipal("HTTP/principal");
validator.setKeyTabLocation(new ClassPathResource("kerberos/http-web.keytab"));
validator.setDebug(true);
return validator;
}
}
【问题讨论】:
-
您的应用程序是否基于任何 Spring Security Kerberos 示例? - docs.spring.io/spring-security-kerberos/docs/1.0.1.RELEASE/…
-
不完全是。我的应用程序分为两部分: - 前端是 Vaadin 应用程序 - 后端是 Spring REST (MVC) 应用程序 后端使用 spring security 和自定义 TokenFilter 进行保护。从浏览器获取的前端发送标头可以说:授权:协商 Y.. 后端验证标头,如果一切正常,则发回 Token 并允许用户执行请求。问题是我需要提供基于 Kerberos 的 SSO。我安装了活动目录,我需要通过 Kerberos 连接到它。第二件事是 AD 位于该应用程序的不同服务器上,但通过 VPN 可见
-
如果您不太了解您的解决方案,我建议您按照链接中该列表中的示例 6,这是一个带有 Kerberos + AD 的 hello world。然后尝试与您现有的解决方案集成。
-
我发现了这个问题 - 我实际上使用的是第 6 章中的示例(当前 1.0.2 快照),我更改了 YML 文件,我可以使用其他客户端浏览 AD,但是当我遇到此错误时使用 Firefox 访问应用程序(
network.negotiate-auth.trusted-uris设置为我的域)。我在域中的 Windows 计算机上运行演示(不在 DC 上)。这些示例对于 Kerberos 非专家来说是相当粗略的。我不知道我是否应该使用krb5.ini,或者当我在 Windows 上时是否需要 keytab 文件。
标签: spring spring-security kerberos