예제 #1
0
        static IIdentity DeserializePrimaryIdentity(XmlDictionaryReader reader, SctClaimDictionary dictionary, XmlObjectSerializer serializer)
        {
            IIdentity identity = null;

            if (reader.IsStartElement(dictionary.PrimaryIdentity, dictionary.EmptyString))
            {
                reader.ReadStartElement();
                if (reader.IsStartElement(dictionary.WindowsSidIdentity, dictionary.EmptyString))
                {
                    SecurityIdentifier sid = ReadSidAttribute(reader, dictionary);
                    string             authenticationType = reader.GetAttribute(dictionary.AuthenticationType, dictionary.EmptyString);
                    reader.ReadStartElement();
                    string name = reader.ReadContentAsString();
                    identity = new WindowsSidIdentity(sid, name, authenticationType ?? String.Empty);
                    reader.ReadEndElement();
                }
                else if (reader.IsStartElement(dictionary.GenericIdentity, dictionary.EmptyString))
                {
                    string authenticationType = reader.GetAttribute(dictionary.AuthenticationType, dictionary.EmptyString);
                    reader.ReadStartElement();
                    string name = reader.ReadContentAsString();
                    identity = SecurityUtils.CreateIdentity(name, authenticationType ?? String.Empty);
                    reader.ReadEndElement();
                }
                else
                {
                    identity = (IIdentity)serializer.ReadObject(reader);
                }
                reader.ReadEndElement();
            }
            return(identity);
        }
예제 #2
0
            public override SecurityKeyIdentifierClause ReadClause(XmlDictionaryReader reader, byte[] derivationNonce, int derivationLength, string tokenType)
            {
                string encodingType = reader.GetAttribute(XD.SecurityJan2004Dictionary.EncodingType, null);

                if (encodingType == null)
                {
                    encodingType = DefaultEncodingType;
                }

                reader.ReadStartElement();

                byte[] bytes;
                if (encodingType == EncodingTypeValueBase64Binary)
                {
                    bytes = reader.ReadContentAsBase64();
                }
                else if (encodingType == EncodingTypeValueHexBinary)
                {
                    bytes = HexBinary.Parse(reader.ReadContentAsString()).Value;
                }
                else if (encodingType == EncodingTypeValueText)
                {
                    bytes = new UTF8Encoding().GetBytes(reader.ReadContentAsString());
                }
                else
                {
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SecurityMessageSerializationException(SR.GetString(SR.UnknownEncodingInKeyIdentifier)));
                }

                reader.ReadEndElement();

                return(CreateClause(bytes, derivationNonce, derivationLength));
            }
        private static object DeserializeStruct(XmlDictionaryReader reader, Type targetType)
        {
            if (targetType.IsDefined(typeof(DataContractAttribute), false))
            {
                Dictionary <string, MemberInfo> dataMembers = GetDataMembers(targetType);
                object targetObject = Activator.CreateInstance(targetType);

                reader.ReadStartElement(XmlRpcProtocol.Struct);

                while (reader.NodeType != XmlNodeType.EndElement)
                {
                    string memberName;

                    reader.ReadStartElement(XmlRpcProtocol.Member);
                    reader.ReadStartElement(XmlRpcProtocol.Name);
                    memberName = reader.ReadContentAsString();
                    reader.ReadEndElement();

                    reader.ReadStartElement(XmlRpcProtocol.Value);
                    reader.MoveToContent();
                    if (dataMembers.ContainsKey(memberName))
                    {
                        MemberInfo member = dataMembers[memberName];
                        if (member is PropertyInfo)
                        {
                            ((PropertyInfo)member).SetValue(
                                targetObject,
                                Deserialize(reader, ((PropertyInfo)member).PropertyType),
                                BindingFlags.Instance | BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.NonPublic,
                                null, null,
                                CultureInfo.CurrentCulture);
                        }
                        else if (member is FieldInfo)
                        {
                            ((FieldInfo)member).SetValue(
                                targetObject,
                                Deserialize(reader, ((FieldInfo)member).FieldType),
                                BindingFlags.Instance | BindingFlags.SetField | BindingFlags.Public | BindingFlags.NonPublic,
                                null,
                                CultureInfo.CurrentCulture);
                        }
                    }
                    reader.ReadEndElement(); // value
                    reader.ReadEndElement(); // member
                    while (reader.NodeType == XmlNodeType.Whitespace)
                    {
                        reader.ReadContentAsString();
                    }
                }
                reader.ReadEndElement(); // struct
                reader.MoveToContent();
                return(targetObject);
            }
            else
            {
                throw new InvalidOperationException();
            }
        }
예제 #4
0
        public MessageNumberRolloverFault(FaultCode code, FaultReason reason, XmlDictionaryReader detailReader,
                                          ReliableMessagingVersion reliableMessagingVersion)
            : base(code, WsrmFeb2005Strings.MessageNumberRollover, reason, true, true)
        {
            try
            {
                this.SequenceID = WsrmUtilities.ReadIdentifier(detailReader, reliableMessagingVersion);

                if (reliableMessagingVersion == ReliableMessagingVersion.WSReliableMessaging11)
                {
                    detailReader.ReadStartElement(DXD.Wsrm11Dictionary.MaxMessageNumber,
                                                  WsrmIndex.GetNamespace(reliableMessagingVersion));

                    string maxMessageNumberString = detailReader.ReadContentAsString();
                    ulong  maxMessageNumber;
                    if (!UInt64.TryParse(maxMessageNumberString, out maxMessageNumber) ||
                        (maxMessageNumber <= 0))
                    {
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new XmlException(
                                                                                      SR.GetString(SR.InvalidSequenceNumber, maxMessageNumber)));
                    }
                    // otherwise ignore value

                    detailReader.ReadEndElement();
                }
            }
            finally
            {
                detailReader.Close();
            }
        }
예제 #5
0
            public override SecurityKeyIdentifierClause ReadClause(XmlDictionaryReader reader, byte[] derivationNonce, int derivationLength, string tokenType)
            {
                reader.ReadStartElement(XD.XmlSignatureDictionary.X509Data, XD.XmlSignatureDictionary.Namespace);
                reader.ReadStartElement(XD.XmlSignatureDictionary.X509IssuerSerial, XD.XmlSignatureDictionary.Namespace);
                reader.ReadStartElement(XD.XmlSignatureDictionary.X509IssuerName, XD.XmlSignatureDictionary.Namespace);
                string issuerName = reader.ReadContentAsString();

                reader.ReadEndElement();
                reader.ReadStartElement(XD.XmlSignatureDictionary.X509SerialNumber, XD.XmlSignatureDictionary.Namespace);
                string serialNumber = reader.ReadContentAsString();

                reader.ReadEndElement();
                reader.ReadEndElement();
                reader.ReadEndElement();

                return(new X509IssuerSerialKeyIdentifierClause(issuerName, serialNumber));
            }
예제 #6
0
            public override SecurityKeyIdentifierClause ReadKeyIdentifierClauseCore(XmlDictionaryReader reader)
            {
                SecurityKeyIdentifierClause ski = null;

                reader.ReadStartElement(XD.XmlSignatureDictionary.X509Data, NamespaceUri);
                while (reader.IsStartElement())
                {
                    if (ski == null && reader.IsStartElement(XD.XmlSignatureDictionary.X509Certificate, NamespaceUri))
                    {
                        X509Certificate2 certificate = null;
                        if (!SecurityUtils.TryCreateX509CertificateFromRawData(reader.ReadElementContentAsBase64(), out certificate))
                        {
                            throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SecurityMessageSerializationException(SR.GetString(SR.InvalidX509RawData)));
                        }
                        ski = new X509RawDataKeyIdentifierClause(certificate);
                    }
                    else if (ski == null && reader.IsStartElement(XmlSignatureStrings.X509Ski, NamespaceUri.ToString()))
                    {
                        ski = new X509SubjectKeyIdentifierClause(reader.ReadElementContentAsBase64());
                    }
                    else if ((ski == null) && reader.IsStartElement(XD.XmlSignatureDictionary.X509IssuerSerial, XD.XmlSignatureDictionary.Namespace))
                    {
                        reader.ReadStartElement(XD.XmlSignatureDictionary.X509IssuerSerial, XD.XmlSignatureDictionary.Namespace);
                        reader.ReadStartElement(XD.XmlSignatureDictionary.X509IssuerName, XD.XmlSignatureDictionary.Namespace);
                        string issuerName = reader.ReadContentAsString();
                        reader.ReadEndElement();
                        reader.ReadStartElement(XD.XmlSignatureDictionary.X509SerialNumber, XD.XmlSignatureDictionary.Namespace);
                        string serialNumber = reader.ReadContentAsString();
                        reader.ReadEndElement();
                        reader.ReadEndElement();

                        ski = new X509IssuerSerialKeyIdentifierClause(issuerName, serialNumber);
                    }
                    else
                    {
                        reader.Skip();
                    }
                }
                reader.ReadEndElement();
                return(ski);
            }
    public override object ReadObject(XmlDictionaryReader reader, bool verifyObjectName)
    {
        reader.ReadFullStartElement();
        Dictionary <string, string> r = new Dictionary <string, string>();

        while (reader.IsStartElement("property"))
        {
            reader.ReadFullStartElement("property");
            reader.ReadFullStartElement("key");
            string key = reader.ReadContentAsString();
            reader.ReadEndElement();
            reader.ReadFullStartElement("value");
            string value = reader.ReadContentAsString();
            reader.ReadEndElement();
            r.Add(key, value);

            reader.ReadEndElement();
            reader.MoveToContent();
        }
        return(r);
    }
예제 #8
0
        /// <summary>
        /// Returns name of Struct-Member
        /// </summary>
        /// <param name="reader">XML Reader</param>
        /// <returns>name of struct-member as string</returns>
        private string ParseMemberName(XmlDictionaryReader reader)
        {
            string name;

            if (reader.IsEmptyElement)
            {
                throw new ArgumentException("Emty in 'name' ");
            }
            reader.ReadStartElement("name");
            reader.MoveToContent();
            name = reader.ReadContentAsString();
            reader.ReadEndElement();
            return(name);
        }
예제 #9
0
 public static void DeserializeJsonAsFlatDictionary(IDictionary<string, string> messageDictionary, XmlDictionaryReader reader)
 {
     reader.Read();
     while (reader.Read())
     {
         if(reader.NodeType == XmlNodeType.EndElement)
         {
             continue;
         }
         string key = reader.Name;
         reader.Read();
         string value = reader.ReadContentAsString();
         messageDictionary[key] = value;
     }
 }
 public UnsupportedSelectionFault(Message message, FaultCode code, FaultReason reason, XmlDictionaryReader detailReader)
     : base(message, code, MakeConnectionConstants.Fault.UnsupportedSelectionFault, reason)
 {
     if (detailReader != null)
     {
         try
         {
             detailReader.ReadStartElement(MakeConnectionConstants.Fault.UnsupportedSelectionFault, MakeConnectionConstants.Namespace);
             this.elementName = detailReader.ReadContentAsString();
             detailReader.ReadEndElement();
         }
         finally
         {
             detailReader.Close();
         }
     }
 }
예제 #11
0
        /// <summary>
        /// Reads JSON as a flat dictionary into a message.
        /// </summary>
        /// <param name="messageDictionary">The message dictionary to fill with the JSON-deserialized data.</param>
        /// <param name="reader">The JSON reader.</param>
        internal static void DeserializeJsonAsFlatDictionary(IDictionary <string, string> messageDictionary, XmlDictionaryReader reader)
        {
            Requires.NotNull(messageDictionary, "messageDictionary");
            Requires.NotNull(reader, "reader");

            reader.Read();             // one extra one to skip the root node.
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.EndElement)
                {
                    // This is likely the closing </root> tag.
                    continue;
                }

                string key = reader.Name;
                reader.Read();
                string value = reader.ReadContentAsString();
                messageDictionary[key] = value;
            }
        }
 public MessageNumberRolloverFault(FaultCode code, FaultReason reason, XmlDictionaryReader detailReader, ReliableMessagingVersion reliableMessagingVersion) : base(code, "MessageNumberRollover", reason, true, true)
 {
     try
     {
         base.SequenceID = WsrmUtilities.ReadIdentifier(detailReader, reliableMessagingVersion);
         if (reliableMessagingVersion == ReliableMessagingVersion.WSReliableMessaging11)
         {
             ulong num;
             detailReader.ReadStartElement(DXD.Wsrm11Dictionary.MaxMessageNumber, WsrmIndex.GetNamespace(reliableMessagingVersion));
             if (!ulong.TryParse(detailReader.ReadContentAsString(), out num) || (num <= 0L))
             {
                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new XmlException(System.ServiceModel.SR.GetString("InvalidSequenceNumber", new object[] { num })));
             }
             detailReader.ReadEndElement();
         }
     }
     finally
     {
         detailReader.Close();
     }
 }
예제 #13
0
        internal X509CertificateEndpointIdentity(XmlDictionaryReader reader)
        {
            if (reader == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("reader");
            }

            reader.MoveToContent();
            if (reader.IsEmptyElement)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new XmlException(SR.Format(SR.UnexpectedEmptyElementExpectingClaim, XD.AddressingDictionary.X509v3Certificate.Value, XD.AddressingDictionary.IdentityExtensionNamespace.Value)));
            }

            reader.ReadStartElement(XD.XmlSignatureDictionary.X509Data, XD.XmlSignatureDictionary.Namespace);
            while (reader.IsStartElement(XD.XmlSignatureDictionary.X509Certificate, XD.XmlSignatureDictionary.Namespace))
            {
                reader.MoveToContent();
                X509Certificate2 certificate = new X509Certificate2(Convert.FromBase64String(reader.ReadContentAsString()));
                if (certificateCollection.Count == 0)
                {
                    // This is the first certificate. We assume this as the primary
                    // certificate and initialize the base class.
                    Initialize(new Claim(ClaimTypes.Thumbprint, certificate.GetCertHash(), Rights.PossessProperty));
                }

                certificateCollection.Add(certificate);
            }

            reader.ReadEndElement();

            if (certificateCollection.Count == 0)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new XmlException(SR.Format(SR.UnexpectedEmptyElementExpectingClaim, XD.AddressingDictionary.X509v3Certificate.Value, XD.AddressingDictionary.IdentityExtensionNamespace.Value)));
            }
        }
예제 #14
0
        /// <summary>
        /// Returns object from XML message after reading tag "value"
        /// </summary>
        /// <param name="reader">XML Reader</param>
        /// <returns>returned object</returns>
        private object ParseValue(XmlDictionaryReader reader)
        {
            if (reader.IsEmptyElement)
            {
                throw new ArgumentException("Emty in 'value' ");
            }
            object value     = null;
            string valueType = null;
            string result    = null;

            reader.ReadStartElement("value");
            reader.MoveToContent();
            while (reader.NodeType != XmlNodeType.EndElement)
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    valueType = reader.Name.ToLower();
                    if ((valueType != "struct") && (valueType != "array"))
                    {
                        reader.Read();
                    }
                }
                if ((reader.NodeType == XmlNodeType.Text) || (reader.NodeType == XmlNodeType.Whitespace))
                {
                    result = reader.ReadContentAsString();
                    value  = result;
                }
                if (valueType != null)
                {
                    switch (valueType)
                    {
                    case "string":
                        value = result;
                        break;

                    case "int":
                    case "i4":
                        Int64 intVal;
                        if (Int64.TryParse(result, out intVal))
                        {
                            value = intVal;
                        }
                        else
                        {
                            throw new FormatException(String.Format("The value cannot be parse as an integer."));
                        }
                        break;


                    case "boolean":
                    case "bool":
                        Boolean boolVal;
                        if (Boolean.TryParse(result, out boolVal))
                        {
                            value = boolVal;
                        }
                        else
                        {
                            Int16 boolIntVal;
                            if (Int16.TryParse(result, out boolIntVal))
                            {
                                value = boolIntVal == 1;
                            }

                            else
                            {
                                throw new FormatException(String.Format("The value cannot be parsed as a boolean."));
                            }
                        }
                        break;

                    case "double":
                    case "float":
                        Double doubleVal;
                        if (Double.TryParse(result, out doubleVal))
                        {
                            value = doubleVal;
                        }
                        else
                        {
                            throw new FormatException(String.Format("The value cannot be parsed as a double."));
                        }
                        break;

                    case "dateTime.iso8601":
                        break;

                    case "array":
                        value = ParseArray(reader);
                        break;

                    case "struct":
                        value = ParseStruct(reader);
                        break;


                    default:
                        throw new ArgumentException();
                    }
                    reader.ReadEndElement();
                }
            }

            reader.ReadEndElement();
            return(value);

            //if (value != null) return value;
            //else throw new NotImplementedException();
        }