【发布时间】:2020-04-05 00:36:59
【问题描述】:
我正在解决与 perl 模块 AuthCASSaml 相关的问题。我们有一个软件,我们想使用我们的 CAS 服务器进行身份验证。身份验证正在工作。但是,当 AuthCASSaml 处理返回的输出时,它最终会返回 inf HASH 引用,而不是 CAS 服务器返回的 ldap 属性的实际值。我已将其精确定位到 AuthCASSaml.pm 代码的这一部分:
my $user = $responseBase->{'saml1:Assertion'}{'saml1:AuthenticationStatement'}{'saml1:Subject'}{'saml1:NameIdentifier'};
my %casAttrs;
my $attrs = $responseBase->{'saml1:Assertion'}{'saml1:AttributeStatement'}{'saml1:Attribute'};
if($attrs) {
for(my $i=0;$i<@$attrs;$i++) {
my $attr = $$attrs[$i];
my $name = $attr->{'AttributeName'};
my $value = $attr->{'saml1:AttributeValue'};
$casAttrs{$name} = $value;
}
}
“AttributeName”按预期返回。问题在于“AttributeValue”。该代码似乎需要一个字符串,但从 CAS 服务器返回的“AttributeValue”的 xml 代码不仅仅是一个简单的字符串。
<saml1:Attribute AttributeName="UDC_IDENTIFIER" AttributeNamespace="http://www.ja-sig.org/products/cas/">
<saml1:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">useriden</saml1:AttributeValue>
</saml1:Attribute>
返回的是“属性:uid=>HASH(0x331ecb0), UDC_IDENTIFIER=>HASH(0x331ee90)”。
我还要注意,我们运行的所有代码都是供应商提供的。我不是 perl 程序员。我只是想让所有的东西一起玩得很好。说来话长,但我只想说供应商在这种情况下无济于事。
我可以提供 cgi 脚本中的代码进行测试,但主要软件代码也遇到了这个问题,这就是为什么我很确定 AuthCASSaml.pm 是尝试解决这个问题的地方。
非常感谢任何帮助。
【问题讨论】:
-
似乎从您的 XML 解析器中掉出的数据不是代码所期望的。这可能有很多原因。如果您无法更改该代码,那么您很可能不走运。恐怕您必须向供应商提供适当的错误报告。
-
看来the module 使用XML::Simple。这是不应使用 XML::Simple 的原因之一。
-
是的,它确实使用 XML::Simple 恐怕。该软件的代码非常陈旧。上一次进行任何真正的更新是在 2014 年。如果由我决定,我会扔掉这个软件。不幸的是,这不是我的决定。我很欣赏这些回复,因为它们证实了我对整个代码的一些怀疑。