我有一些关于在不使用表单后备的情况下设置 SPNEGO 的问题。
我正在编写一个使用 SPNEGO 身份验证并为经过身份验证的主体返回签名 JWT 的 Web 服务。我对表单没有任何用处(例如,不能使用带有仅身份验证主体的表单)。
- 我可以跳过 spring SPNEGO 参考中所示的 formLogin() 和 logout() 部分,并使用零参数 SpnegoEntryPoint 构造函数吗?
- 从查看SPNEGO 过滤器的来源看来,如果缺少 Authorization 标头,则过滤器实际上不会返回带有 WWW-Authenticate: Negotiate 质询的 401 Unauthorized 响应给调用者。也就是说,
else
第 135 行的检查没有。我读对了吗?RFC 规定如果服务器接收到访问受保护对象的请求,并且如果尚未发送可接受的 Authorization 标头,则服务器会以“401 Unauthorized”状态代码和“WWW-Authenticate:”标头进行响应
- 如果以上是正确的,客户端是否会抢先发送 Authorization 标头?
谢谢!
编辑(可能已解决):我原来的安全配置有:
http.exceptionHandling()
.authenticationEntryPoint(spnegoEntryPoint())
.and()
.authorizeRequests()
.antMatchers("/v1/**").permitAll()
.anyRequest().authenticated()
.and()
.addFilterBefore()...`
当我删除.antMatchers("/v1/**").permitAll()
SpnegoEntryPoint 时,我现在看到一个带有 WWW-Authenticate: Negotiate 响应的 401。
当然,现在我遇到Server not found in Kerberos database
gss_init_sec_context() 失败,但我怀疑这与 SPN 设置或主机名解析有关(因为我在我的 Macbook 上进行本地测试)而不是 Spring 应用程序。
当我得到这个工作时,最终会更新一次。