为什么这不是一个有效的saml2请求?

时间:2016-11-28 09:55:56

标签: java azure saml-2.0 opensaml

我正在使用Opensaml为azure生成saml2身份验证请求

<?xml version="1.0" encoding="UTF-8"?>
<samlp:AuthnRequest AssertionConsumerServiceURL="https://myserver.de/_saml/validate/azure"
ForceAuthn="false" ID="0" IsPassive="false" IssueInstant="2016-11-28T09:46:43.215Z"
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Version="2.0" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<samlp:Issuer xmlns:samlp="urn:oasis:names:tc:SAML:2.0:assertion">issuerid</samlp:Issuer>
<saml2p:NameIDPolicy AllowCreate="true"
    Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
    SPNameQualifier="Isser" xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" />
<saml2p:RequestedAuthnContext Comparison="exact"
    xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol">
    <saml:AuthnContextClassRef xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
</saml2p:RequestedAuthnContext>
</samlp:AuthnRequest>

XML使用org.opensaml.xml.io.Marshaller和java.util.zip.DeflaterOutputStream.DeflaterOutputStream编码到Base64,我通过使用一些在线saml解码器来验证它。

我从azure得到的错误是:

AADSTS75005: The request is not a valid Saml2 protocol message.

任何人都可以提供帮助吗?

1 个答案:

答案 0 :(得分:1)

在元素&#39; AuthnRequest&#39;你定义属性&#39; ID&#39;作为&#39; 0&#39;。这不是原子类型的有效值&#39; xs:ID&#39;。

我引用了Oasis文档的技术规则:

  

xs:ID简单类型用于声明SAML标识符   断言,请求和响应。声明为值的值   xs:本规范中的ID必须满足以下属性   除了xs:ID类型本身的定义强加的那些:

     
      
  • 分配标识符的任何一方必须确保存在   该方或任何其他方的概率可以忽略不计   意外地将相同的标识符分配给不同的数据对象。
  •   
  • 如果数据对象声明它具有特定标识符,   必须有一个这样的声明。
  •   
     

a的机制   SAML系统实体确保标识符是唯一的   实施。在随机或伪随机的情况下   采用的技术,两个随机选择的概率   标识符相同必须小于或等于2-128和   应该小于或等于2-160。

您应该使用现有方法之一来生成ID。