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

问题描述

我已经使用 Azure应用代理 SAML SSO 配置了内部部署 MVC应用。

当我在内部部署应用程序用户访问网址下浏览时,我能够重定向到内部部署应用程序。

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>,但没有发生。

请帮助我。

解决方法

从评论中移动答案,

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