多个应用程序上的SSO和REST Api身份验证

时间:2014-08-08 07:34:56

标签: spring oauth-2.0 cas jwt rest-security

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

但是,我们还希望使用CAS Server保护我们的REST Apis。 我们的首选流程如下:

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

听起来像OA服务器,CAS服务器确实支持,但用户不会随时要求提供凭据,但我们也希望为服务提供身份验证,即调用我们的API的其他应用程序:

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

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

我不知道如何实现此流程,而无需大量自定义CAS服务器并自行实现此行为。

Google将{JWT用于OAuth 2.0 for Server to Server Applications,这似乎是最佳选择。

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

最诚挚的问候, 马可

2 个答案:

答案 0 :(得分:8)

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

CAS服务器上的

  • 实现了一个REST端点,允许客户端通过为特定的 clientId 和 clientSecret 来获取 CAS服务票证ST >服务网址的。 clientId clientSecret 分别被视为用户名密码
    • REST端点创建新的自定义 TokenBasedAuthenticationCredentials 对象,并将其传递给 CentralAuthenticationService 以授予TGT和ST( service-url 授予 ST 的>与 clientId clientSecret 对关联,并且可以从例如user-database clientId获取| clientSecret |。的serviceUrl
  • 实施了新的 AuthenticationHandler CredentialsToPrcincipalResolver ,仅支持 TokenBasedAuthenticationCredentials

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

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

at(基于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 并覆盖 acquireArtifact(request)以从HTTP Authorization-Header <获取 ST / LI>

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

  • 从CAS服务器获取 ST
  • ST 提供给受保护资源的每个请求 Authorization-Header
GET /rest/foo/bar HTTP/1.1
Host: www.example.com
Authorization: CUSTOM_SCHEME ST-ALKSJDFLSJDFLKJ-Ljksdf-sdflkjsf

由于CAS客户端 CasAuthenticationFilter 在每个请求上获得工件(即 ST ),因此客户端只需一次请求即可进行身份验证。

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

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

答案 1 :(得分:0)

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