SAML 对话使用什么编码?

What is encoding used for SAML conversations?

我正在将一项服务设置为 SAML2.0 服务提供商 (SP)。因此,我需要生成 SAML 请求并接受 SAML 响应。 SAML 响应(带有 IDP 发起的断言)可能会在没有请求的情况下出现。这就是 SSO 和 SAML 的世界,我有这么多工作要做。

我的感觉是 SAML 请求或响应可能会缩小,也可能不会缩小。 SP 减少 SAML 请求似乎是一种很好的做法。

请求和响应也是 Base 64 编码的。但这是我的问题。假设我收到了 SAML 响应。它是 Base 64 编码的。当我解码时,我得到一个字节数组。假设这没有缩小,我现在需要从该字节数组中获取一个字符串,以便将其视为 XML.

我应该为该字符串采用什么编码?

因此,在 c#/.NET/MVC 世界中:

    public ActionResult ConsumeSamlAssertion(string samlResponse)
    {
        if (string.IsNullOrWhiteSpace(samlResponse))
        {
            return Content("Consumption URL hit without a SAML Response");
        }

        // MVC Already gives me this URL-decoded

        byte[] bytes = Convert.FromBase64String(samlResponse);

        // For this question, assume that this is not deflated.

        string samlXmlIfAscii = Encoding.ASCII.GetString(bytes);
        string samlXmlIfUtf8 = Encoding.UTF8.GetString(bytes);

        // Which is correct?  Or is there a different one?

这是我错过的某些标准吗(不是因为不想看)?

非常感谢。

我在 SAML2 规范中找不到关于使用何种编码的权威信息。我用过 UTF8 并且它有效。

关于放气步骤 - 这取决于绑定。在消息在查询字符串中传递的重定向绑定中,它被缩小了。在 POST 绑定中,它作为表单字段过去时未缩小。

另外,我建议您查看现有的 .NET SAML2 堆栈,而不是自己动手。正确执行 SAML2 需要大量工作,而且很容易出现 XML 签名包装等安全问题。

SAML 请求和响应采用 XML 格式,因此这归结为如何对 XML 数据进行编码的问题。 参见示例:Meaning of - <?xml version="1.0" encoding="utf-8"?>

XML 的默认编码(如果不存在前导码,或者未指定编码)是 UTF-8。因此,我们可以说XML规范权威地规定可以使用UTF-8。

我不清楚是否所有 SAML 实现和 SAML 规范本身都允许其他编码,但使用 UTF-8 应该是安全的。