예제 #1
0
        public static SecurityContextSecurityToken ResolveCookie(byte [] bytes, byte [] cookie)
        {
            string   id           = null;
            UniqueId context      = null;
            DateTime validFrom    = DateTime.MinValue,
                     validTo      = DateTime.MaxValue,
                     keyEffective = DateTime.MinValue,
                     keyExpired   = DateTime.MaxValue;

            byte []               key    = null;
            X509Certificate2      cert   = null;
            X500DistinguishedName issuer = null;

            XmlDictionary dic = new XmlDictionary();

            for (int i = 0; i < 30; i++)
            {
                dic.Add("n" + i);
            }
            // FIXME: create proper quotas
            XmlDictionaryReaderQuotas quotas =
                new XmlDictionaryReaderQuotas();
            XmlDictionaryReader cr = XmlDictionaryReader.CreateBinaryReader(bytes, 0, bytes.Length, dic, quotas);

            cr.MoveToContent();              // -> n1
            cr.ReadStartElement("n0", String.Empty);
            do
            {
                cr.MoveToContent();
                if (cr.NodeType == XmlNodeType.EndElement)
                {
                    break;
                }
                if (cr.NodeType != XmlNodeType.Element)
                {
                    throw new Exception("Unxpected non-element content:" + cr.NodeType);
                }

                switch (cr.Name)
                {
                case "n1":
                    // FIXME: some integer here
                    int n1 = cr.ReadElementContentAsInt();
                    if (n1 != 1)
                    {
                        throw new Exception("INTERNAL ERROR: there was unexpected n2 content: " + n1);
                    }
                    break;

                case "n2":
                    context = cr.ReadElementContentAsUniqueId();
                    break;

                case "n3":
                    id = cr.ReadElementContentAsString();
                    break;

                case "n4":
                    key = cr.ReadElementContentAsBase64();
                    break;

                case "n7":
                    validFrom = new DateTime(cr.ReadElementContentAsLong());
                    break;

                case "n8":
                    validTo = new DateTime(cr.ReadElementContentAsLong());
                    break;

                case "n10":
                    keyEffective = new DateTime(cr.ReadElementContentAsLong());
                    break;

                case "n11":
                    keyExpired = new DateTime(cr.ReadElementContentAsLong());
                    break;

                case "n13":
                    // <n18>X509Certificate</n18>
                    cr.Read();
                    cr.MoveToContent();
                    cert = new X509Certificate2(cr.ReadElementContentAsBase64());
                    cr.ReadEndElement();
                    break;

                case "n15":
                    // <n16><n24 n25="IssuerName" /></n16>
                    cr.Read();
                    cr.ReadStartElement("n16", String.Empty);
                    issuer = new X500DistinguishedName(cr.GetAttribute("n25"));
                    bool empty = cr.IsEmptyElement;
                    cr.ReadStartElement("n24", String.Empty);
                    if (!empty)
                    {
                        cr.ReadEndElement();                  // n24
                    }
                    cr.ReadEndElement();                      // n16
                    cr.ReadEndElement();                      // n15
                    break;

                default:
                    throw new Exception("INTERNAL ERROR: there was an unhandled element: " + cr.Name);
                }
            } while (true);

            SecurityContextSecurityToken sct = new SecurityContextSecurityToken(
                context, id, key, validFrom, validTo,
                null, keyEffective, keyExpired, null);

            sct.Cookie = cookie;
            return(sct);
        }
예제 #2
0
            public object ReadValue(XmlDictionaryReader reader)
            {
                object value;

                if (isArray)
                {
                    switch (typeCode)
                    {
                    case TypeCode.Byte:
                        value = reader.ReadElementContentAsBase64();
                        break;

                    case TypeCode.Boolean:
                        if (!reader.IsEmptyElement)
                        {
                            reader.ReadStartElement();
                            value = reader.ReadBooleanArray(itemName, itemNamespace);
                            reader.ReadEndElement();
                        }
                        else
                        {
                            reader.Read();
                            value = new bool[0];
                        }
                        break;

                    case TypeCode.DateTime:
                        if (!reader.IsEmptyElement)
                        {
                            reader.ReadStartElement();
                            value = reader.ReadDateTimeArray(itemName, itemNamespace);
                            reader.ReadEndElement();
                        }
                        else
                        {
                            reader.Read();
                            value = new DateTime[0];
                        }
                        break;

                    case TypeCode.Decimal:
                        if (!reader.IsEmptyElement)
                        {
                            reader.ReadStartElement();
                            value = reader.ReadDecimalArray(itemName, itemNamespace);
                            reader.ReadEndElement();
                        }
                        else
                        {
                            reader.Read();
                            value = new Decimal[0];
                        }
                        break;

                    case TypeCode.Int32:
                        if (!reader.IsEmptyElement)
                        {
                            reader.ReadStartElement();
                            value = reader.ReadInt32Array(itemName, itemNamespace);
                            reader.ReadEndElement();
                        }
                        else
                        {
                            reader.Read();
                            value = new Int32[0];
                        }
                        break;

                    case TypeCode.Int64:
                        if (!reader.IsEmptyElement)
                        {
                            reader.ReadStartElement();
                            value = reader.ReadInt64Array(itemName, itemNamespace);
                            reader.ReadEndElement();
                        }
                        else
                        {
                            reader.Read();
                            value = new Int64[0];
                        }
                        break;

                    case TypeCode.Single:
                        if (!reader.IsEmptyElement)
                        {
                            reader.ReadStartElement();
                            value = reader.ReadSingleArray(itemName, itemNamespace);
                            reader.ReadEndElement();
                        }
                        else
                        {
                            reader.Read();
                            value = new Single[0];
                        }
                        break;

                    case TypeCode.Double:
                        if (!reader.IsEmptyElement)
                        {
                            reader.ReadStartElement();
                            value = reader.ReadDoubleArray(itemName, itemNamespace);
                            reader.ReadEndElement();
                        }
                        else
                        {
                            reader.Read();
                            value = new Double[0];
                        }
                        break;

                    default:
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SFxInvalidUseOfPrimitiveOperationFormatter)));
                    }
                }
                else
                {
                    switch (typeCode)
                    {
                    case TypeCode.Boolean:
                        value = reader.ReadElementContentAsBoolean();
                        break;

                    case TypeCode.DateTime:
                        value = reader.ReadElementContentAsDateTime();
                        break;

                    case TypeCode.Decimal:
                        value = reader.ReadElementContentAsDecimal();
                        break;

                    case TypeCode.Double:
                        value = reader.ReadElementContentAsDouble();
                        break;

                    case TypeCode.Int32:
                        value = reader.ReadElementContentAsInt();
                        break;

                    case TypeCode.Int64:
                        value = reader.ReadElementContentAsLong();
                        break;

                    case TypeCode.Single:
                        value = reader.ReadElementContentAsFloat();
                        break;

                    case TypeCode.String:
                        return(reader.ReadElementContentAsString());

                    default:
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SFxInvalidUseOfPrimitiveOperationFormatter)));
                    }
                }
                return(value);
            }
예제 #3
0
            public object ReadValue(XmlDictionaryReader reader)
            {
                object obj2;

                if (!this.isArray)
                {
                    switch (this.typeCode)
                    {
                    case TypeCode.Int32:
                        return(reader.ReadElementContentAsInt());

                    case TypeCode.Int64:
                        return(reader.ReadElementContentAsLong());

                    case TypeCode.Single:
                        return(reader.ReadElementContentAsFloat());

                    case TypeCode.Double:
                        return(reader.ReadElementContentAsDouble());

                    case TypeCode.Decimal:
                        return(reader.ReadElementContentAsDecimal());

                    case TypeCode.DateTime:
                        return(reader.ReadElementContentAsDateTime());

                    case TypeCode.String:
                        return(reader.ReadElementContentAsString());

                    case TypeCode.Boolean:
                        return(reader.ReadElementContentAsBoolean());
                    }
                    throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("SFxInvalidUseOfPrimitiveOperationFormatter")));
                }
                switch (this.typeCode)
                {
                case TypeCode.Boolean:
                    if (reader.IsEmptyElement)
                    {
                        reader.Read();
                        return(new bool[0]);
                    }
                    reader.ReadStartElement();
                    obj2 = reader.ReadBooleanArray(this.itemName, this.itemNamespace);
                    reader.ReadEndElement();
                    return(obj2);

                case TypeCode.Byte:
                    return(reader.ReadElementContentAsBase64());

                case TypeCode.Int32:
                    if (reader.IsEmptyElement)
                    {
                        reader.Read();
                        return(new int[0]);
                    }
                    reader.ReadStartElement();
                    obj2 = reader.ReadInt32Array(this.itemName, this.itemNamespace);
                    reader.ReadEndElement();
                    return(obj2);

                case TypeCode.Int64:
                    if (reader.IsEmptyElement)
                    {
                        reader.Read();
                        return(new long[0]);
                    }
                    reader.ReadStartElement();
                    obj2 = reader.ReadInt64Array(this.itemName, this.itemNamespace);
                    reader.ReadEndElement();
                    return(obj2);

                case TypeCode.Single:
                    if (reader.IsEmptyElement)
                    {
                        reader.Read();
                        return(new float[0]);
                    }
                    reader.ReadStartElement();
                    obj2 = reader.ReadSingleArray(this.itemName, this.itemNamespace);
                    reader.ReadEndElement();
                    return(obj2);

                case TypeCode.Double:
                    if (reader.IsEmptyElement)
                    {
                        reader.Read();
                        return(new double[0]);
                    }
                    reader.ReadStartElement();
                    obj2 = reader.ReadDoubleArray(this.itemName, this.itemNamespace);
                    reader.ReadEndElement();
                    return(obj2);

                case TypeCode.Decimal:
                    if (reader.IsEmptyElement)
                    {
                        reader.Read();
                        return(new decimal[0]);
                    }
                    reader.ReadStartElement();
                    obj2 = reader.ReadDecimalArray(this.itemName, this.itemNamespace);
                    reader.ReadEndElement();
                    return(obj2);

                case TypeCode.DateTime:
                    if (reader.IsEmptyElement)
                    {
                        reader.Read();
                        return(new DateTime[0]);
                    }
                    reader.ReadStartElement();
                    obj2 = reader.ReadDateTimeArray(this.itemName, this.itemNamespace);
                    reader.ReadEndElement();
                    return(obj2);
                }
                throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("SFxInvalidUseOfPrimitiveOperationFormatter")));
            }