什么是用于SAML对话的编码?

时间:2016-04-15 22:44:05

标签: c# character-encoding saml-2.0

我正在将服务设置为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?

这是否符合某些标准我错过了(这不是因为不想看)?

非常感谢。

2 个答案:

答案 0 :(得分:1)

我在SAML2规范中找不到任何有关使用哪种编码的权威内容。我使用过UTF8,它可以工作。

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

另外,我建议您查看.NET的现有SAML2堆栈,而不是自己滚动。正确完成SAML2的工作很多,并且很容易出现XML签名包装等安全问题。

答案 1 :(得分:0)

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

XML的默认编码(如果没有前置码,或者未指定编码)为UTF-8。因此,可以说XML规范权威地指定可以使用UTF-8。

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