internal static WsTrustResponse CreateFromResponseDocument(XDocument responseDocument, WsTrustVersion version)
{
Dictionary<string, string> tokenResponseDictionary = new Dictionary<string, string>();
try
{
XNamespace t = XmlNamespace.Trust;
if (version == WsTrustVersion.WsTrust2005)
{
t = XmlNamespace.Trust2005;
}
bool parseResponse = true;
if (version == WsTrustVersion.WsTrust13)
{
XElement requestSecurityTokenResponseCollection =
responseDocument.Descendants(t + "RequestSecurityTokenResponseCollection").FirstOrDefault();
if (requestSecurityTokenResponseCollection == null)
{
parseResponse = false;
}
}
if (parseResponse)
{
IEnumerable<XElement> tokenResponses =
responseDocument.Descendants(t + "RequestSecurityTokenResponse");
foreach (var tokenResponse in tokenResponses)
{
XElement tokenTypeElement = tokenResponse.Elements(t + "TokenType").FirstOrDefault();
if (tokenTypeElement == null)
{
continue;
}
XElement requestedSecurityToken =
tokenResponse.Elements(t + "RequestedSecurityToken").FirstOrDefault();
if (requestedSecurityToken == null)
{
continue;
}
// TODO #123622: We need to disable formatting due to a potential service bug. Remove the ToString argument when problem is fixed.
tokenResponseDictionary.Add(tokenTypeElement.Value,
requestedSecurityToken.FirstNode.ToString(SaveOptions.DisableFormatting));
}
}
}
catch (XmlException ex)
{
PlatformPlugin.Logger.Error(null, ex);
throw new MsalException(MsalError.ParsingWsTrustResponseFailed, ex);
}
if (tokenResponseDictionary.Count == 0)
{
throw new MsalException(MsalError.ParsingWsTrustResponseFailed);
}
string tokenType = tokenResponseDictionary.ContainsKey(Saml1Assertion) ? Saml1Assertion : tokenResponseDictionary.Keys.First();
WsTrustResponse wsTrustResponse = new WsTrustResponse
{
TokenType = tokenType,
Token = tokenResponseDictionary[tokenType]
};
return wsTrustResponse;
}
}