1

我想知道 CAS 是如何工作的(需要工作流程)。想象:

  1. 用户在 App1 上使用 CAS 进行身份验证(例如,example.com/app1)。
  2. 用户转到另一个应用程序 (example.com/app2)。

每个应用程序都必须在页面顶部显示用户名。他们怎么知道的?如果只有一个应用程序,工作流程非常清晰:

  1. App1:当用户在没有认证的情况下浏览页面时,只显示“登录”链接作为用户名。
  2. App1:有一刻用户按下登录。
  3. App1:将用户重定向到 CAS
  4. CAS:请求用户的登录/通过
  5. CAS:用户输入登录名/密码
  6. CAS:将用户重定向回 App1
  7. App1:从 CAS 获取令牌和用户名(或 ID),并赋予该用户一些权限。完毕。

但是现在:App2(App3 等)如何知道用户已经通过身份验证?他们是否都必须将用户从每个页面重定向到 CAS 只是为了知道用户是否已经通过身份验证并请求他的名字?

在 Spring 的情况下,这将是一个巨大的重定向,而我有一些独立的应用程序,例如:

example.com/App1
example.com/App2
...
example.com/AppN
4

3 回答 3

3

我还没有 10 声望,所以你需要检查工作流图像

http://idms.rutgers.edu/cas/how_does_it_work.shtml

当新用户最初登录到应用程序时,他们不会与应用程序建立会话。应用程序(通过 CAS 客户端)不会显示要求输入用户名和密码的登录表单,而是将浏览器重定向到 CAS 登录页面。

CAS 然后对用户进行身份验证。如果验证失败,CAS 登录页面将再次显示并显示错误消息。因此,在身份验证成功之前,不会将用户返回给应用程序。如果用户此时不确定如何继续,CAS 登录页面上有帮助台链接。一旦用户成功验证,CAS 会将浏览器重定向回您的应用程序。CAS 知道通过附加到 CAS 登录 url 的 {service} 参数重定向到哪里。

当 CAS 将经过身份验证的用户重定向回您的应用程序时,它会将 {ticket} 参数附加到您的 url。

返回给您的应用程序的票证是不透明的,这意味着它不包含对 CAS 服务器以外的任何人有用的信息。您的应用程序唯一能做的就是将此票证发送回 CAS 进行验证。

然后 CAS 将响应此票证不代表此服务的有效用户,或确认此票证证明身份验证。在后一种情况下,CAS 还将提供用户名,以便您知道用户的身份。

应用程序必须提供自己的会话管理。一旦用户通过身份验证,您的应用程序应该在会话中跟踪这一事实,这样您就不必使用 CAS 服务器重新对他们进行身份验证。通常,这与您直接从应用程序对用户进行身份验证相同。

每个应用程序都应提供自己的注销工具,这将使会话无效并要求用户重新验证进入应用程序。请注意,如果他们通过 myRutgers 门户使用 SSO,则无需重新输入用户名和密码。

于 2013-05-23T18:41:36.997 回答
1

使用 CAS 意味着 CAS-Server 跟踪全局认证的用户(使用存储 Ticket Granting Ticket Id - TGT 的 cookie)。每个应用程序都必须维护自己的机制来跟踪主体会话和相应的信息。

因此,如果用户想要访问安全的应用程序 APP1(并且未经过身份验证),他将被重定向到 CAS-Server。如果不发送有效的 TGT,则会显示登录表单,否则(或在成功向 CAS-Server 进行身份验证后)生成服务票证 (ST),必须将其提交给 APP1。在这里,此服务票证针对 CAS-Server 进行验证(使用服务器到服务器通信) - 如果有效,则返回 userId(可能还有其他信息)。现在由应用程序 APP1 根据 userId 创建一个主体并提供授权信息(例如,CAS-Server 针对 LDAP 进行身份验证,而 APP1 将用户数据存储在数据库中)。对 APP1 的所有后续请求不应再涉及 CAS-Server。

如果用户向 APP2 发出请求,则上述进程将再次重新启动。

于 2012-09-27T20:17:27.163 回答
0

同步,

您是否尝试将您的问题发布到 cas-users [cas-user@lists.jasig.org] 邮件列表?

在过去的 6 个月里,我一直在使用 CAS,据我了解,App2(App3 等)如果没有重定向到 CAS,就无法了解用户属性。

您可以通过将用户属性与您的网络会话一起存储和/或通过在显示登录名的页面中嵌入 iframe-header 来避免将 App2 的所有页面置于 CAS 过滤器后面。

作为 CAS 贡献者的 Marvin 在 GitHub 上维护了一个出色的 CAS 客户端测试 web 应用程序,您可以在其中看到他是如何读取用户属性的。 https://github.com/serac/java-cas-client-test

于 2012-09-24T05:32:14.067 回答