在多个应用程序上进行SSO和REST Api身份验证

马可·艾格

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

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

  • 用户为应用程序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将OWT 2.0的JWT用于服务器到服务器的应用程序,这似乎是可行的方法。

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

最好的问候,马可

马可·艾格

最终,我们以一种简单的方式使其工作:

在CAS服务器上:

  • 实现了REST端点,该端点允许客户端通过提供特定服务URLclientIdclientSecret来获取CAS服务凭单STclientIdclientSecret分别视为用户名密码
    • 的REST端点创建一个新的自定义TokenBasedAuthenticationCredentials对象,并将其传递到集中式认证服务授予TGT和ST(所述服务URL的量,ST被授予与相关联的clientIdclientSecret一对,并且可以从例如获得,用户数据库clientId | clientSecret | serviceUrl)。
  • 实现了一个新的AuthenticationHandlerCredentialsToPrcincipalResolver它们支持TokenBasedAuthenticationCredentials

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并重写getArtifact(request)从HTTP Authorization-Header获取ST

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

  • 从CAS服务器获取ST
  • 在每个请求中向受保护资源提供ST作为Authorization-Header
GET / 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服务器和客户端,随后又会造成严重的安全漏洞。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章