WIF:"签名令牌通用XML令牌......没有密钥"

时间:2015-09-30 14:13:35

标签: office365 wif adfs

对于客户,我试图使用ADFS OnPrem从MicrosoftOnline(office 365)获取令牌。简而言之:

  1. 从OnPrem STS(Adfs)请求令牌
  2. 将收到的令牌发送到Federated STS(MicrosoftOnline)
  3. 现在,我确实有工作代码将硬编码的肥皂消息发送到ADFS& MicrosoftOnline。我正在尝试重构此代码以使用WIF,但我很难让第2步工作。我可以很好地管理第1步,但是当我尝试调用MicrosoftOnline时,我收到以下错误:

      

    未处理的类型' System.InvalidOperationException'   发生在mscorlib.dll

         

    其他信息:签名令牌通用XML令牌:

         

    validFrom:09/30/2015 13:25:40

         

    validTo:09/30/2015 14:25:40

         

    InternalTokenReference:   SamlAssertionKeyIdentifierClause(AssertionId =   ' _622096af-9cb5-4b19-b69d-5d60639c16e3&#39)

         

    ExternalTokenReference:   SamlAssertionKeyIdentifierClause(AssertionId =   ' _622096af-9cb5-4b19-b69d-5d60639c16e3&#39)

         

    令牌元素:(断言,urn:oasis:names:tc:SAML:1.0:断言)

         

    没有钥匙。安全令牌用于需要它的上下文中   执行加密操作,但令牌包含否   加密密钥。令牌类型不支持   加密操作,或特定令牌实例不   包含加密密钥。检查您的配置以确保这一点   加密禁用令牌类型(例如,   UserNameSecurityToken)未在需要的上下文中指定   加密操作(例如,支持令牌)。

    这是我到目前为止的代码。调用 channel.issue 时会抛出错误。

    public static SecurityToken GetRSTSToken(SecurityToken idpToken)
    {
        var binding = new IssuedTokenWSTrustBinding2();
        binding.SecurityMode = SecurityMode.TransportWithMessageCredential;
    
        var factory = new WSTrustChannelFactory(
            binding,
            "https://login.microsoftonline.com/RST2.srf");
        factory.TrustVersion = TrustVersion.WSTrust13;
        factory.Credentials.SupportInteractive = false;
        factory.Credentials.UseIdentityConfiguration = true;
    
        var rst = new RequestSecurityToken
        {
            RequestType = RequestTypes.Issue,
            AppliesTo = new EndpointReference("urn:crmemea:dynamics.com"),
        };
    
        var channel = factory.CreateChannelWithIssuedToken(idpToken);
        SecurityToken returnValue = channel.Issue(rst);
        return returnValue;
    }
    

    GetRSTSToken 的调用之前是对方法 GetToken 的调用。 GetToken 的输出传递给 GetRSTSToken 。我使用Fiddler检查肥皂消息,它们几乎与我在当前工作代码中发送的肥皂消息相同。唯一不同的是您期望的字段(id' s,时间戳等)。

    public static SecurityToken GetToken(string username, string password)
    {
        // Windows authentication over transport security
        var factory = new WSTrustChannelFactory(
            new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential),
            "https://sts.windesheim.nl/adfs/services/trust/13/usernamemixed");
        factory.TrustVersion = TrustVersion.WSTrust13;
        factory.Credentials.UserName.UserName = username;
        factory.Credentials.UserName.Password = password;
        factory.Credentials.UseIdentityConfiguration = true;
    
        var rst = new RequestSecurityToken
        {
            RequestType = RequestTypes.Issue,
            AppliesTo = new EndpointReference("urn:federation:MicrosoftOnline"),
            KeyType = KeyTypes.Bearer
        };
    
        var channel = factory.CreateChannel();
        SecurityToken returnValue = channel.Issue(rst);
        return returnValue;
    }
    

    注意:UserNameWSTrustBinding和IssuedTokenWSTrustBinding来自Thinktecture.IdentityModel(https://github.com/IdentityModel/Thinktecture.IdentityModel.45

    供参考,以下是-working-soap消息:

    1. 致OnPrem STS
    2. 肥皂请求

      <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
          <s:Header>
              <a:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue</a:Action>
              <a:MessageID>urn:uuid:755c37dd-eee4-4e7e-a9e0-be3c6289b46a</a:MessageID>
              <a:ReplyTo>
                  <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
              </a:ReplyTo>
              <a:To s:mustUnderstand="1">[sts_url]</a:To>
              <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
                  <u:Timestamp u:Id="_0">
                      <u:Created>2015-06-10T08:21:44.804Z</u:Created>
                      <u:Expires>2015-06-10T08:26:44.804Z</u:Expires>
                  </u:Timestamp>
                  <o:UsernameToken u:Id="uuid-3e6d680b-4cb1-4c38-aff8-93c8fa8bd0c6-1">
                      <o:Username>[username]</o:Username>
                      <o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">[password]</o:Password>
                  </o:UsernameToken>
              </o:Security>
          </s:Header>
          <s:Body>
              <trust:RequestSecurityToken xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
                  <wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
                      <a:EndpointReference>
                          <a:Address>urn:federation:MicrosoftOnline</a:Address>
                      </a:EndpointReference>
                  </wsp:AppliesTo>
                  <trust:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer</trust:KeyType>
                  <trust:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</trust:RequestType>
              </trust:RequestSecurityToken>
          </s:Body>
      </s:Envelope>
      

      肥皂反应

      <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
          <s:Header>
              <a:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-sx/ws-trust/200512/RSTRC/IssueFinal</a:Action>
              <a:RelatesTo>urn:uuid:755c37dd-eee4-4e7e-a9e0-be3c6289b46a</a:RelatesTo>
              <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
                  <u:Timestamp u:Id="_0">
                      <u:Created>2015-06-10T08:21:45.097Z</u:Created>
                      <u:Expires>2015-06-10T08:26:45.097Z</u:Expires>
                  </u:Timestamp>
              </o:Security>
          </s:Header>
          <s:Body>
              <trust:RequestSecurityTokenResponseCollection xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
                  <trust:RequestSecurityTokenResponse>
                      <trust:Lifetime>
                          <wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2015-06-10T08:21:45.082Z</wsu:Created>
                          <wsu:Expires xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2015-06-10T09:21:45.082Z</wsu:Expires>
                      </trust:Lifetime>
                      <wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
                          <wsa:EndpointReference xmlns:wsa="http://www.w3.org/2005/08/addressing">
                              <wsa:Address>urn:federation:MicrosoftOnline</wsa:Address>
                          </wsa:EndpointReference>
                      </wsp:AppliesTo>
                      <trust:RequestedSecurityToken>
                          <saml:Assertion MajorVersion="1" MinorVersion="1" AssertionID="_68133973-ed12-49d7-9f43-421bcfe43162" Issuer="http://windesheim.nl/adfs/services/trust/" IssueInstant="2015-06-10T08:21:45.097Z" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion">
                              <saml:Conditions NotBefore="2015-06-10T08:21:45.082Z" NotOnOrAfter="2015-06-10T09:21:45.082Z">
                                  <saml:AudienceRestrictionCondition>
                                      <saml:Audience>urn:federation:MicrosoftOnline</saml:Audience>
                                  </saml:AudienceRestrictionCondition>
                              </saml:Conditions>
                              <saml:AttributeStatement>
                                  <saml:Subject>
                                      <saml:NameIdentifier Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">[..]saml:NameIdentifier>
                                      <saml:SubjectConfirmation>
                                          <saml:ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:bearer</saml:ConfirmationMethod>
                                      </saml:SubjectConfirmation>
                                  </saml:Subject>
                                  <saml:Attribute AttributeName="UPN" AttributeNamespace="http://schemas.xmlsoap.org/claims">
                                      <saml:AttributeValue>[username]</saml:AttributeValue>
                                  </saml:Attribute>
                                  <saml:Attribute AttributeName="ImmutableID" AttributeNamespace="http://schemas.microsoft.com/LiveID/Federation/2008/05">
                                      <saml:AttributeValue>[..]saml:AttributeValue>
                                  </saml:Attribute>
                              </saml:AttributeStatement>
                              <saml:AuthenticationStatement AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:password" AuthenticationInstant="2015-06-10T08:21:45.082Z">
                                  <saml:Subject>
                                      <saml:NameIdentifier Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">[..]</saml:NameIdentifier>
                                      <saml:SubjectConfirmation>
                                          <saml:ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:bearer</saml:ConfirmationMethod>
                                      </saml:SubjectConfirmation>
                                  </saml:Subject>
                              </saml:AuthenticationStatement>
                              <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                                  <ds:SignedInfo>
                                      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                                      <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
                                      <ds:Reference URI="#_68133973-ed12-49d7-9f43-421bcfe43162">
                                          <ds:Transforms>
                                              <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                                              <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                                          </ds:Transforms>
                                          <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                                          <ds:DigestValue[..]</ds:DigestValue>
                                      </ds:Reference>
                                  </ds:SignedInfo>
                                  <ds:SignatureValue>[..]</ds:SignatureValue>
                                  <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                                      <X509Data>[..]</X509Certificate>
                                      </X509Data>
                                  </KeyInfo>
                              </ds:Signature>
                          </saml:Assertion>
                      </trust:RequestedSecurityToken>
                      <trust:RequestedAttachedReference>
                          <o:SecurityTokenReference k:TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:k="http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd">
                              <o:KeyIdentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.0#SAMLAssertionID">[some_guid]</o:KeyIdentifier>
                          </o:SecurityTokenReference>
                      </trust:RequestedAttachedReference>
                      <trust:RequestedUnattachedReference>
                          <o:SecurityTokenReference k:TokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:k="http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd">
                              <o:KeyIdentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.0#SAMLAssertionID[some_guid]</o:KeyIdentifier>
                          </o:SecurityTokenReference>
                      </trust:RequestedUnattachedReference>
                      <trust:TokenType>urn:oasis:names:tc:SAML:1.0:assertion</trust:TokenType>
                      <trust:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</trust:RequestType>
                      <trust:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer</trust:KeyType>
                  </trust:RequestSecurityTokenResponse>
              </trust:RequestSecurityTokenResponseCollection>
          </s:Body>
      </s:Envelope>
      
      1. 至Federated STS
      2. 肥皂请求

        <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <s:Header>
                <a:Action s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue</a:Action>
                <a:MessageID>urn:uuid:0c1704ed-2ef3-4718-87fa-97734518b13f</a:MessageID>
                <a:ReplyTo>
                    <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
                </a:ReplyTo>
                <a:To s:mustUnderstand="1">https://login.microsoftonline.com/RST2.srf</a:To>
                <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
                    <u:Timestamp u:Id="_0">
                        <u:Created>2015-06-10T08:21:45.418Z</u:Created>
                        <u:Expires>2015-06-10T08:26:45.418Z</u:Expires>
                    </u:Timestamp>
                                        <saml:Assertion MajorVersion="1" MinorVersion="1" AssertionID="_68133973-ed12-49d7-9f43-421bcfe43162" Issuer="http://windesheim.nl/adfs/services/trust/" IssueInstant="2015-06-10T08:21:45.097Z" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion">
                                <saml:Conditions NotBefore="2015-06-10T08:21:45.082Z" NotOnOrAfter="2015-06-10T09:21:45.082Z">
                                    <saml:AudienceRestrictionCondition>
                                        <saml:Audience>urn:federation:MicrosoftOnline</saml:Audience>
                                    </saml:AudienceRestrictionCondition>
                                </saml:Conditions>
                                <saml:AttributeStatement>
                                    <saml:Subject>
                                        <saml:NameIdentifier Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">[..]saml:NameIdentifier>
                                        <saml:SubjectConfirmation>
                                            <saml:ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:bearer</saml:ConfirmationMethod>
                                        </saml:SubjectConfirmation>
                                    </saml:Subject>
                                    <saml:Attribute AttributeName="UPN" AttributeNamespace="http://schemas.xmlsoap.org/claims">
                                        <saml:AttributeValue>[username]</saml:AttributeValue>
                                    </saml:Attribute>
                                    <saml:Attribute AttributeName="ImmutableID" AttributeNamespace="http://schemas.microsoft.com/LiveID/Federation/2008/05">
                                        <saml:AttributeValue>[..]saml:AttributeValue>
                                    </saml:Attribute>
                                </saml:AttributeStatement>
                                <saml:AuthenticationStatement AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:password" AuthenticationInstant="2015-06-10T08:21:45.082Z">
                                    <saml:Subject>
                                        <saml:NameIdentifier Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">[..]</saml:NameIdentifier>
                                        <saml:SubjectConfirmation>
                                            <saml:ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:bearer</saml:ConfirmationMethod>
                                        </saml:SubjectConfirmation>
                                    </saml:Subject>
                                </saml:AuthenticationStatement>
                                <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                                    <ds:SignedInfo>
                                        <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                                        <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
                                        <ds:Reference URI="#_68133973-ed12-49d7-9f43-421bcfe43162">
                                            <ds:Transforms>
                                                <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                                                <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                                            </ds:Transforms>
                                            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                                            <ds:DigestValue[..]</ds:DigestValue>
                                        </ds:Reference>
                                    </ds:SignedInfo>
                                    <ds:SignatureValue>[..]</ds:SignatureValue>
                                    <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                                        <X509Data>[..]</X509Certificate>
                                        </X509Data>
                                    </KeyInfo>
                                </ds:Signature>
                            </saml:Assertion>
                </o:Security>
            </s:Header>
            <s:Body>
                <t:RequestSecurityToken xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust">
                    <wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
                        <a:EndpointReference>
                            <a:Address>urn:crmemea:dynamics.com</a:Address>
                        </a:EndpointReference>
                    </wsp:AppliesTo>
                    <t:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</t:RequestType>
                </t:RequestSecurityToken>
            </s:Body>
        </s:Envelope>
        

1 个答案:

答案 0 :(得分:0)

对于未来的googlers,不完全是OP:

我创建了一个SAML持票令牌,并试图将其与ADFS交换为JWT。 需要设置KeyType属性以避免此错误:

var binding = new IssuedTokenWSTrustBinding();
binding.SecurityMode = SecurityMode.TransportWithMessageCredential;
binding.KeyType = SecurityKeyType.BearerKey;


// set up the ws-trust channel factory
var factory = new WSTrustChannelFactory(binding, new EndpointAddress(options.AdfsIssuedTokenMixedEndpoint))
{
    TrustVersion = TrustVersion.WSTrust13
};