11

在我们公司,我们部署了多个使用 CAS 服务器通过 SSO 保护的 Web 应用程序。用户请求应用程序的 url,如果尚未通过身份验证,则会被重定向到 CAS 服务器登录页面。如果身份验证成功,用户将被重定向回最初请求的 url。共同的工作流程和完美的工作。

但是,我们还想使用 CAS 服务器保护我们的 REST API。我们的首选流程如下:

  • 用户为应用程序 REST Api 创建令牌
  • 使用此令牌,用户可以请求临时访问令牌(如 CAS 令牌)
  • 在对 REST Api 的每个请求中,用户将临时访问令牌作为 HTTP 标头或请求参数包含在内
  • REST Api 应用程序根据 CAS 服务器检查提供的临时令牌的有效性

听起来像 CAS 服务器确实支持的 OAuth,除了在任何时候都不会要求用户提供凭据,但我们还想为服务提供身份验证,即其他应用程序调用我们的 API:

  • 开发人员要求提供 REST Api 令牌(与 CAS 用户相关联)
  • 应用程序使用 Api 令牌请求临时访问令牌
  • 对 Api 的进一步请求包括临时访问令牌作为 HTTP 标头或请求参数
  • REST Api 应用程序根据 CAS 服务器检查临时访问令牌的有效性

我们希望我们的 REST Api 应用程序对用户凭据一无所知,他们甚至无法访问用户数据库,这对于使用应用程序的人来说工作得很好(重定向到 CAS 登录页面)。

我不知道我们如何实现这个流程,而不必大量定制 CAS 服务器并自己实现这个行为。

Google 使用 JWT for OAuth 2.0 for Server to Server Applications,这似乎是要走的路。

如果有人可以提供一些提示或替代方案(对 CAS 服务器),我将不胜感激。也许有人已经使用 CAS 服务器实现了这种模式,并且可以提供一些关于这个问题的信息。

最好的问候, 马可

4

2 回答 2

11

最后我们让它以一种简单的方式工作:

在 CAS 服务器上:

  • 实现了一个 REST 端点,允许客户端通过为特定的service-url提供clientIdclientSecret来获取CAS 服务票证 STclientIdclientSecret分别被认为是用户名密码
    • REST 端点创建一个新的自定义TokenBasedAuthenticationCredentials对象并将其传递给CentralAuthenticationService以授予 TGT 和 ST(授予 ST 的服务urlclientIdclientSecret相关联,可以从例如 user-数据库clientId|clientSecret|serviceUrl)。
  • 实现了仅支持TokenBasedAuthenticationCredentials的新AuthenticationHandlerCredentialsToPrcincipalResolver

REST 端点/cas/../token返回一个 JSON 对象:

{ serviceTicket: 'ST-ALKSJDFLSJDFLKJ-Ljksdf-sdflkjsf' }

在(基于 Spring)的 CAS 客户端(受保护的资源):

  • 启用authenticateAllArtifacts
<bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties">
    <property name="service" value="${cas.service.url}" />
    <property name="sendRenew" value="false" />
    <property name="authenticateAllArtifacts" value="true"/>
</bean>
  • 扩展CasAuthenticationFilter并覆盖gainArtifact(request)以从 HTTP Authorization-Header中获取ST

现在,想要访问您的受保护资源的客户端可以

  • 从 CAS 服务器获取ST ,
  • 在对受保护资源的每个请求中提供ST作为Authorization-Header
获取 /rest/foo/bar HTTP/1.1
主机:www.example.com
授权:CUSTOM_SCHEME ST-ALKSJDFLSJDFLKJ-Ljksdf-sdflkjsf

由于 CAS 客户端CasAuthenticationFilter会在每个请求中获取工件(即ST),因此客户端只需在单个请求中进行身份验证。

此外,在 CAS 服务器上,您可以将ST配置为仅对n 个请求有效(CAS 客户端在 CAS 服务器上请求serviceValidate url 的次数)。

我认为这是一个很好的方法,无需大规模定制 CAS 服务器和客户端,并随后产生严重的安全漏洞。

于 2014-08-26T13:49:09.877 回答
0

服务票不是设计为一次性使用的吗?

于 2014-11-21T14:40:47.033 回答