static void PopulateCache(Dictionary<Key, GenericXmlSecurityToken> cache, Stream stream) { XmlTextReader reader = new XmlTextReader(stream); while (reader.IsStartElement("Entry")) { reader.ReadStartElement(); Uri target = new Uri(reader.ReadElementString("Target")); string issuerStr = reader.ReadElementString("Issuer"); Uri issuer = string.IsNullOrEmpty(issuerStr) ? null : new Uri(issuerStr); reader.ReadStartElement("Token"); reader.ReadStartElement("XML"); XmlDocument doc = new XmlDocument(); XmlElement tokenXml = doc.ReadNode(reader) as XmlElement; reader.ReadEndElement(); byte[] key = Convert.FromBase64String(reader.ReadElementString("Key")); reader.ReadElementString("Id"); DateTime validFrom = Convert.ToDateTime(reader.ReadElementString("ValidFrom")); DateTime validTo = Convert.ToDateTime(reader.ReadElementString("ValidTo")); WSSecurityTokenSerializer serializer = new WSSecurityTokenSerializer(); reader.ReadStartElement("InternalTokenReference"); SecurityKeyIdentifierClause internalReference = serializer.ReadKeyIdentifierClause(reader); reader.ReadEndElement(); reader.ReadStartElement("ExternalTokenReference"); SecurityKeyIdentifierClause externalReference = serializer.ReadKeyIdentifierClause(reader); reader.ReadEndElement(); reader.ReadEndElement(); // token reader.ReadEndElement(); // entry List<IAuthorizationPolicy> policies = new List<IAuthorizationPolicy>(); GenericXmlSecurityToken token = new GenericXmlSecurityToken(tokenXml, new BinarySecretSecurityToken(key), validFrom, validTo, internalReference, externalReference, new ReadOnlyCollection<IAuthorizationPolicy>(policies)); cache.Add(new Key(target, issuer), token); } }
public Microsoft.ResourceManagement.WebServices.Client.ContextualSecurityToken GetContextTokenFromResponse(ContextMessageProperty context) { Microsoft.ResourceManagement.WebServices.Client.ContextualSecurityToken returnToken = null; if (RequestedSecurityToken != null) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(new XmlNodeReader(RequestedSecurityToken)); XmlNamespaceManager nsManager = new XmlNamespaceManager(xmlDoc.NameTable); nsManager.AddNamespace("saml", "urn:oasis:names:tc:SAML:1.0:assertion"); DateTime effectiveTime = DateTime.Parse( RequestedSecurityToken.SelectSingleNode( "saml:Conditions/@NotBefore", nsManager ).Value); DateTime expirationTime = DateTime.Parse( RequestedSecurityToken.SelectSingleNode( "saml:Conditions/@NotOnOrAfter", nsManager ).Value); WSSecurityTokenSerializer serializer = new WSSecurityTokenSerializer(); SecurityToken requestedProofToken = serializer.ReadToken( new XmlNodeReader(this.RequestedProofToken), new SecurityContextSecurityTokenResolver(Int32.MaxValue, false)); SecurityKeyIdentifierClause requestedUnattachedReference = serializer.ReadKeyIdentifierClause(new XmlNodeReader(RequestedUnattachedReference)); SecurityKeyIdentifierClause requestedAttachedReference = serializer.ReadKeyIdentifierClause(new XmlNodeReader(RequestedAttachedReference)); returnToken = new ContextualSecurityToken( new GenericXmlSecurityToken( RequestedSecurityToken, requestedProofToken, effectiveTime, expirationTime, requestedUnattachedReference, requestedAttachedReference, new ReadOnlyCollection<IAuthorizationPolicy>(new List<IAuthorizationPolicy>()) ), context); } return returnToken; }