无法从使用 Azure SAML SSO 配置的本地应用程序中的 C# 中的 Request.Params 获取 SAML 响应

Posted

技术标签:

【中文标题】无法从使用 Azure SAML SSO 配置的本地应用程序中的 C# 中的 Request.Params 获取 SAML 响应【英文标题】:Unable to get SAMLResponse from Request.Params in C# from onpremise app configured with Azure SAML SSO 【发布时间】:2021-01-12 02:37:37 【问题描述】:

我已经使用 Azure App ProxySAML SSO 配置了 本地 MVC 应用。

当我在 onpremise 应用 user access url 下方浏览时,我能够重定向到本地应用。

https://myapps.microsoft.com/signin/....

Request.Params.Keys 中缺少 SAMLResponse

我能够在 Fiddler 中获得请求的 SAMLResponse,当我对其进行解码时,我获得了所有必需的登录用户相关声明。

但在 C# 中,我无法从 Request.Params 获取 SAMLResponse

我正在使用下面的代码来阅读声明。

  foreach (string s in Request.Params.Keys)
    
        if (s.ToString() == "SAMLResponse") // SAMLResponse is missing from Request.Params.Keys, but from Fiddler, I' able to view SAMLResponse
        
            rawSamlData = Request.Params[s];
            break;
        
    

    if (rawSamlData != null)
    
        byte[] samlData = Convert.FromBase64String(rawSamlData);

        // read back into a UTF string  
        string samlAssertion = Encoding.UTF8.GetString(samlData);

        XmlDocument doc = new XmlDocument();
        XmlNamespaceManager xMan = new XmlNamespaceManager(doc.NameTable);
        xMan.AddNamespace("saml2p", "urn:oasis:names:tc:SAML:2.0:protocol");
        xMan.AddNamespace("saml2", "urn:oasis:names:tc:SAML:2.0:assertion");
        xMan.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#");

        doc.LoadXml(Encoding.UTF8.GetString(samlData));
        XmlNode xNode = doc.SelectSingleNode("/saml2p:Response/saml2:Assertion/saml2:AttributeStatement/saml2:Attribute[@Name='http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress']", xMan);

        string NewEmailAddressCliams = null;
        foreach (XmlNode x in xNode)
        
            NewEmailAddressCliams += x.InnerText; // Email address returned from claim.
                      
    

如果我在 Fiddler 中获得 SAMLResponse,那么我也应该使用 Request.Params 从 C# 获得 SAMLResponse strong> 但它没有发生。

请帮我解决这个问题。

【问题讨论】:

嗨@Chandra,Request.Params 是键/值对(集合)的组合,其中已经包含您的SAML 信息。您需要遍历它以获取准确的数据。 【参考方案1】:

来自 cmets 的移动答案,

Request.Params 是键/值对(集合)的组合,其中已经包含您的 SAML 信息。您需要遍历它以获得准确的数据。

【讨论】:

以上是关于无法从使用 Azure SAML SSO 配置的本地应用程序中的 C# 中的 Request.Params 获取 SAML 响应的主要内容,如果未能解决你的问题,请参考以下文章

ReactJS 与 azure SAML SSO 的集成

无法更改 Spring 安全 SAML SSO 中的默认“回复 URL”(断言消费者服务位置)

如何在多租户环境中自动选择配置的 SAML 身份提供程序以使用 Spring SAML 进行 SSO

配置 ADFS 3.0 / SAML 2.0 以使用 Spring Security 进行 SSO 集成

SSO:SAML与LDAP?

Spring SAML SSO 不共享会话