2

我有一些关于在不使用表单后备的情况下设置 SPNEGO 的问题。

我正在编写一个使用 SPNEGO 身份验证并为经过身份验证的主体返回签名 JWT 的 Web 服务。我对表单没有任何用处(例如,不能使用带有仅身份验证主体的表单)。

  1. 我可以跳过 spring SPNEGO 参考中所示的 formLogin() 和 logout() 部分,并使用零参数 SpnegoEntryPoint 构造函数吗?
  2. 从查看SPNEGO 过滤器的来源看来,如果缺少 Authorization 标头,则过滤器实际上不会返回带有 WWW-Authenticate: Negotiate 质询的 401 Unauthorized 响应给调用者。也就是说,else第 135 行的检查没有。我读对了吗?RFC 规定

    如果服务器接收到访问受保护对象的请求,并且如果尚未发送可接受的 Authorization 标头,则服务器会以“401 Unauthorized”状态代码和“WWW-Authenticate:”标头进行响应

  3. 如果以上是正确的,客户端是否会抢先发送 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 databasegss_init_sec_context() 失败,但我怀疑这与 SPN 设置或主机名解析有关(因为我在我的 Macbook 上进行本地测试)而不是 Spring 应用程序。

当我得到这个工作时,最终会更新一次。

4

1 回答 1

1
  1. 是的,零参数构造函数是正确的。
  2. Filter 不负责设置 Status 和 Header。SpnegoEntryPoint 是。org.springframework.security.kerberos.web.authentication.SpnegoEntryPoint.commence(HttpServletRequest,HttpServletResponse,AuthenticationException)
  3. 不,见2。
于 2018-02-21T07:35:35.583 回答