基于令牌的身份验证的SSO有多安全?

4
我计划将Jasper服务器与我的Web应用程序集成为单点登录。我阅读了Jasper身份验证手册并且Jasper建议基于令牌的身份验证作为解决方案之一(因为身份验证已由我的Web应用程序完成)。
Jasper建议的是:
您以特定格式(在tokenFormatMapping下定义)传递令牌给Jasper服务器,Jasper将对请求进行身份验证。
因此,有效的令牌可以是:
   u=user|r=role1|o=org1|pa1=PA11|pa2=PA21|exp=2001404150601

无效令牌可以是

   u1=user|r=role1|o=org1|pa1=PA11|pa2=PA21|exp=2001404150601
   r=role1|u=user|o=org1|pa1=PA11|pa2=PA21|exp=2001404150601

我的问题是这个过程真的安全吗?因为一旦黑客知道了模式,他就可以简单地登录到Jasper服务器? 对我来说,看起来安全性可能会受到威胁。我有什么遗漏吗?
<bean class="com.jaspersoft.jasperserver.api.security.externalAuth.wrappers.spring.preauth.JSPreAuthenticatedAuthenticationProvider">
 ....................
      <property name="tokenPairSeparator" value="|" />
      <property name="tokenFormatMapping">
        <map>
          <entry key="username" value="u" />
          <entry key="roles" value="r" />
          <entry key="orgId" value="o" />
          <entry key="expireTime" value="exp" />
          <entry key="profile.attribs">
            <map>
              <entry key="profileAttrib1" value="pa1" />
              <entry key="profileAttrib2" value="pa2" />
            </map>
          </entry>
        </map>
      </property>
      <property name="tokenExpireTimestampFormat" value="yyyyMMddHHmmssZ" />
    </bean>
  </property>
</bean>
2个回答

1
根据Jasper Reports身份验证手册,使用基于令牌的身份验证时,用户不会直接登录,这意味着只能使用此方法执行某些操作。此外,它还指定了以下内容:
JasperReports Server接受任何格式正确的令牌;因此,您需要采取以下措施来保护令牌的完整性:
  • 使用SSL连接到JasperReports Server以防止令牌被拦截
  • 加密令牌以防篡改。
  • 配置令牌使用时间戳以防重放攻击。如果没有时间戳,则在将令牌包含在网页或REST Web服务URL中时,URL可能会被未经授权的人员或系统复制并使用。为令牌设置过期时间将阻止令牌/URL用于超出指定时间进行身份验证。您可以根据您的用例设置到期时间。对于已登录应用程序/门户并请求访问JasperReports Server的用户,从请求时间起一分钟或更短的到期时间是适当的。

所有通信都需要通过SSL隧道进行。否则,任何人都可以建立到JR服务器的连接,发送令牌并从中获取信息。


在基于令牌的身份验证中,JasperReports服务器登录界面不会显示给用户,用户也无法直接登录。这句话让我感到非常困惑。书籍中也没有提到“使用令牌方法可以执行哪些操作”。我的直觉是,如果令牌正确并且传递了角色信息,则用户可以执行任何类型的操作。 - emilly
文档非常清楚说明了这一点。当使用基于令牌的身份验证时,非常重要的是您的外部系统配置正确,以防止攻击者伪造令牌。还应注意,您使用的安全系统方法越多(基于角色的权限、SSL隧道、令牌加密、短TTL、更改默认已知端口、不提供关于服务器如何提供Jasper报告的信息),就越好。如果我对安全性有如此关注,我会进一步查看是否可以修改令牌格式。 - ibelcomputing
在使用令牌登录之前,由于需要在外部用户和角色之间进行同步,以使“JasperReports服务器环境反映出令牌中定义的用户角色和组织”,因此不能使用填充了随机数据的令牌进行登录。那肯定是荒谬的。 - ibelcomputing
为了完整起见,令牌格式确实可以从默认值进行修改。但是分隔符不能是等号、逗号或问号。 - ibelcomputing
1
那些Jasper文档很令人困惑:加密本身并不能防止篡改(请谷歌一下),而时间戳也不能防止重放攻击。 - Hans Z.
显示剩余4条评论

0

我也想要在Jasper Server中实现基于令牌的SSO,但卡在了完全相同的问题上。这种方法对我来说似乎不安全,因为只要请求格式正确,身份验证就永远不会被拒绝,而这是一件简单的事情。

另一个选择(如果您没有使用CAS或LDAP提供程序)是根据请求进行身份验证,如身份验证食谱中的第7.4节“基于请求的身份验证”所述。创建自己的自定义身份验证提供程序,并在applicationContext-externalAuth.xml中进行配置:

<bean id="customAuthenticationManager" class="org.springframework.security.
providers.ProviderManager">
<property name="providers">
<list>
<ref bean="${bean.myCustomProvider}"/>
<ref bean="${bean.daoAuthenticationProvider}"/>
</list>
</property>
</bean>

谢谢Tripti。CAS或LDAP对我来说不是一个选择,因为我的Web应用程序目前不支持它们。通过更多的研究,我发现基于令牌的身份验证可以通过加密和解密(例如基于共享密钥)来确保安全性。所以对我来说这似乎是安全的。 - emilly
关于自定义身份验证提供程序,就像Authbook所说的那样:“当您的用户请求具有足够的信息以便您的自定义身份验证方法可以直接从请求中进行身份验证时...”。即使在这种情况下,我也无法想象您将通过请求传递哪些足够的信息,以便Jasper可以对其进行身份验证。(我只能想到某种令牌,这让我回到了基于令牌的身份验证。) - emilly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接