0

按照说明使用 CAS-client 时,我已经达到了从外部 CAS 服务器获得肯定响应的地步:

CAS server responded with #<Net::HTTPOK 200 OK readbody=true>:

XML是这样的:

<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
  <cas:authenticationSuccess>
    <cas:attributes>
      <cas:user>4oaz8QMucIrlFOU7dr3QpWkqbRY=</cas:user>
      <cas:ccc></cas:ccc>
      <cas:tipo>EDITED_OUT</cas:tipo>
      <cas:acceso>cd</cas:acceso>
      <cas:identificador>EDITED_OUT</cas:identificador>
      <cas:txtBienvenida>EDITED_OUT</cas:txtBienvenida>
      <cas:usuarioValidado>S</cas:usuarioValidado>
      <cas:correo>EDITED_OUT</cas:correo>
      <cas:tlf>EDITED_OUT</cas:tlf>
      <cas:tipoAcceso>2</cas:tipoAcceso>
      <cas:xusuario>EDITED_OUT</cas:xusuario>
      <!-- En caso de que el usuario disponga de certificado digital -->

      <cas:nif>EDITED_OUT</cas:nif>
      <cas:email>EDITED_OUT</cas:email>
      <cas:apellido1>EDITED_OUT</cas:apellido1>
      <cas:apellido2>EDITED_OUT</cas:apellido2>
      <cas:anagramaFiscal>EDITED_OUT</cas:anagramaFiscal>
      <cas:nombre>EDITED_OUT</cas:nombre>

      <!-- Faltan las fechas -->

      <cas:tipoCertificado>EDITED_OUT</cas:tipoCertificado>
      <cas:emisor>EDITED_OUT</cas:emisor>
      <cas:usoCertificado>EDITED_OUT</cas:usoCertificado>
      <cas:apellidosResponsable>EDITED_OUT</cas:apellidosResponsable>

      <!-- Faltan las fechas -->

      <cas:politica>1.3.6.1.4.1.5734.3.5</cas:politica>
      <cas:subject>EDITED_OUT</cas:subject>
      <cas:versionPolitica>45</cas:versionPolitica>
      <cas:organizacionEmisora>FNMT</cas:organizacionEmisora>
      <cas:idPolitica>DEFAULT</cas:idPolitica>
      <cas:numSerie>EDITED_OUT</cas:numSerie>
      <cas:clasificacion>FNMT</cas:clasificacion>
      <cas:tipoAfirma>0</cas:tipoAfirma>
    </cas:attributes>
  </cas:authenticationSuccess>
</cas:serviceResponse>

然后我从 ruby​​cas-client 收到这条日志消息:

Ticket "EDITED_OUT" for service "EDITED_OUT" belonging to user nil is VALID.

然后这个错误转储:

TypeError (can't dup NilClass):
  org/jruby/RubyKernel.java:1894:in `dup'
  ----CUTTED----

检查代码,我得出的结论是错误在filter.rb第 64 行:

controller.session[client.username_session_key] = st.user.dup

调试时,我检查了st对象的内容:

(rdb:2) st.is_valid?
true
(rdb:2) st.user
nil
(rdb:2) st
#<CASClient::ServiceTicket:0x7e054262
  @renew=nil,
  @extra_attributes={
    "user"=>"4oaz8QMucIrlFOU7dr3QpWkqbRY="
    "ccc"=>nil,
    "tipo"=>"CIUDADANO",
    "acceso"=>"cd",
    "identificador"=>"EDITED_OUT",
    "txtBienvenida"=>"EDITED_OUT",
    "usuarioValidado"=>"S", 
    "correo"=>"EDITED_OUT",
    "tlf"=>"EDITED_OUT",
    "tipoAcceso"=>"2",
    "xusuario"=>"EDITED_OUT",
    "nif"=>"EDITED_OUT", 
    "email"=>"EDITED_OUT",
    "apellido1"=>"EDITED_OUT",
    "apellido2"=>"EDITED_OUT",      
    "anagramaFiscal"=>"EDITED_OUT",         
    "nombre"=>"EDITED_OUT",
    "tipoCertificado"=>"FNMT PF",       
    "emisor"=>"EDITED_OUT",
    "usoCertificado"=>"EDITED_OUT",
    "apellidosResponsable"=>"EDITED_OUT",
    "politica"=>"1.3.6.1.4.1.5734.3.5",
    "subject"=>"EDITED_OUT",
    "versionPolitica"=>"45",
    "organizacionEmisora"=>"FNMT",
    "idPolitica"=>"DEFAULT",
    "numSerie"=>"EDITED_OUT",
    "clasificacion"=>"FNMT",
    "tipoAfirma"=>"0"
  },
  @service="EDITED_OUT",
  @failure_code=nil,
  @ticket="EDITED_OUT",
  @pgt_iou=nil,
  @user=nil,
  @failure_message=nil,
  @success=true
>

然后,研究 xml 解析和response.rb,我在第 55 行得到了这个:

cas_user = @xml.elements["cas:user"]

cas_user 始终为零,因为 XML 根中没有cas:user元素,但有一个作为cas:attributes的子元素,因此:

@xml.elements["cas:attributes/cas:user"]

返回一些东西,在我的例子中,一些看起来像某种摘要的东西,虽然我不知道它是如何编码的或者那里有什么信息。

我的问题是,如果该cas:attributes/cas:user属性是客户端试图从 XML 解析的属性,还是其他属性。另外,我想知道我上面粘贴的 XML 格式是否符合 CAS-2.0 协议,或者错误是否来自格式错误的 XML。奇怪的是 ruby​​cas-client 将所有“有用的数据”存储在extra_attributes中。

我正在使用以下内容:

谢谢你的帮助。

4

1 回答 1

0

cas:user 是响应中返回的 netid/主体名称。您的 cas:user 输出让我认为 CAS 服务器正在使用 OAUTH 提供程序。CAS 还支持匿名化特定服务的用户名属性,以便服务只保证每个实例都获取用户名。它可以在服务注册表中(取消)选择。

CAS 2.0协议官方不支持属性发布;只有 SAML 1.1 协议正式支持它。(即将推出的 CAS 3.0 客户端将正式支持属性发布。)许多站点实施了一个简单的修改以允许 CAS 2.0 发布属性,但站点可以按照他们的意愿实现它。

于 2013-09-19T15:38:02.840 回答