1

当我运行以下代码(使用 ComponentSpace Saml 2.0 lib)时,Fiddler 向我显示 SAMLRequest 的值是这样加密的,<input type="hidden" name="SAMLRequest" value="PHNhbWxwOkF1dGhu....">这是非常预期的行为。该代码实现了SSO SAML 2.0 POST配置文件的第一步。请注意,代码中没有指定证书密钥来进行任何类型的加密,所以我想知道 ComponentSpace lib 如何决定选择哪一个?

   var authnRequest = new AuthnRequest
        {
            Destination = @"https://idpserver/...",
            Issuer = new Issuer(@"https://sp/..."),
            ForceAuthn = false,
            NameIDPolicy = new NameIDPolicy(null, null, true), 
            ProtocolBinding = SAMLIdentifiers.BindingURIs.HTTPPost,
            AssertionConsumerServiceURL = @"https://sp/..."
        };

        var relayState = RelayStateCache.Add(new RelayState(@"https://sp/...", null));

        ServiceProvider.SendAuthnRequestByHTTPPost(
            new HttpResponseWrapper(_context.Response), 
            @"https://idpserver/...", 
            authnRequest.ToXml(), 
            relayState);

维基百科所说的只是“ SAMLRequest 参数的值是 base64 编码”。没有关于密钥用于编码的信息。

4

2 回答 2

1

很抱歉误解了你的问题。您的示例代码构造并发送了一个身份验证请求。听起来您在询问 SAML 响应中包含的 SAML 断言。

身份提供者使用服务提供者的公钥加密 SAML 断言。服务提供商将使用其私钥解密断言。

如果您想查看这方面的示例,请查看 AssertionExample 项目,该项目演示了加密/解密 SAML 断言。

您提供的链接中的第 2 步描述了 SP 通过 HTTP/POST 向 IdP 发送 AuthnRequest。发送 AuthnRequest 不涉及 XML 加密。XML 使用 deflate 和 base-64 编码,但没有加密。此编码在您调用 ServiceProvider.SendAuthnRequestByHTTPPost 时为您完成。

于 2012-09-05T21:26:14.717 回答
0

签署授权请求是可选的。

要签署请求,在调用 ServiceProvider.SendAuthnRequestByHTTPPost 之前,您需要执行以下操作:

// Serialize to XML
XmlElement authnRequestElement = authnRequest.ToXml();

// Sign the authn request
SAMLMessageSignature.Generate(authnRequestElement, x509Certificate.PrivateKey, x509Certificate);

// Send the authn request to the IdP
ServiceProvider.SendAuthnRequestByHTTPPost(..., authnRequestElement, ...);

您始终使用您的私钥签名,收件人将使用您的公钥/证书验证签名。

于 2012-09-05T04:25:33.257 回答