/// <summary> Read the Shibboleth system configuration file from within the config subfolder on the web app </summary>
        /// <param name="ConfigFile"> Complete path and name of the configuration file to read </param>
        /// <returns> Built configuration object for Shibboleth authentication </returns>
        public static Shibboleth_Configuration Read_Config(string ConfigFile)
        {
            Shibboleth_Configuration returnValue = new Shibboleth_Configuration();

            // Streams used for reading
            Stream readerStream = null;
            XmlTextReader readerXml = null;

            try
            {
                // Open a link to the file
                readerStream = new FileStream(ConfigFile, FileMode.Open, FileAccess.Read);

                // Open a XML reader connected to the file
                readerXml = new XmlTextReader(readerStream);

                while (readerXml.Read())
                {
                    if (readerXml.NodeType == XmlNodeType.Element)
                    {
                        switch (readerXml.Name.ToLower())
                        {
                            case "shibboleth":
                                read_shibb_details(readerXml, returnValue);
                                break;
                        }
                    }
                }
            }
            catch (Exception ee)
            {
                returnValue.Error = ee.Message;
            }
            finally
            {
                if (readerXml != null)
                {
                    readerXml.Close();
                }
                if (readerStream != null)
                {
                    readerStream.Close();
                }
            }

            return returnValue;
        }
        private static void read_shibb_details(XmlReader ReaderXml, Shibboleth_Configuration Config)
        {
            // Read the attributes
            if (ReaderXml.MoveToAttribute("UserIdentityAttribute"))
                Config.UserIdentityAttribute = ReaderXml.Value.Trim();

            if (ReaderXml.MoveToAttribute("URL"))
                Config.ShibbolethURL = ReaderXml.Value.Trim();

            if (ReaderXml.MoveToAttribute("Label"))
                Config.Label = ReaderXml.Value.Trim();

            if (ReaderXml.MoveToAttribute("Debug"))
            {
                if (String.Compare(ReaderXml.Value.Trim(), "true", StringComparison.OrdinalIgnoreCase) == 0)
                    Config.Debug = true;
            }

            if (ReaderXml.MoveToAttribute("Enabled"))
            {
                if (String.Compare(ReaderXml.Value.Trim(), "false", StringComparison.OrdinalIgnoreCase) == 0)
                    Config.Enabled = false;
            }

            // Just step through the subtree of this
            ReaderXml.MoveToElement();
            XmlReader subTreeReader = ReaderXml.ReadSubtree();
            while (subTreeReader.Read())
            {
                if (subTreeReader.NodeType == XmlNodeType.Element)
                {
                    switch (subTreeReader.Name.ToLower())
                    {
                        case "mapping":
                            string serverVariable = null;
                            string userAttribute = null;
                            if (subTreeReader.MoveToAttribute("ServerVariable"))
                                serverVariable = subTreeReader.Value.Trim();
                            if (subTreeReader.MoveToAttribute("UserAttribute"))
                                userAttribute = subTreeReader.Value.Trim();
                            if ((!String.IsNullOrEmpty(serverVariable)) && (!String.IsNullOrEmpty(userAttribute)))
                            {
                                User_Object_Attribute_Mapping_Enum userAttrEnum = User_Object_Attribute_Mapping_Enum_Converter.ToEnum(userAttribute.ToUpper());
                                if (userAttrEnum != User_Object_Attribute_Mapping_Enum.NONE)
                                {
                                    Config.Add_Attribute_Mapping(serverVariable, userAttrEnum);
                                }
                            }
                            break;

                        case "constant":
                            string userAttribute2 = null;
                            string constantValue = null;
                            if (subTreeReader.MoveToAttribute("UserAttribute"))
                                userAttribute2 = subTreeReader.Value.Trim();
                            if (!subTreeReader.IsEmptyElement)
                            {
                                subTreeReader.Read();
                                constantValue = subTreeReader.Value.Trim();
                            }
                            if ((!String.IsNullOrEmpty(userAttribute2)) && (!String.IsNullOrEmpty(constantValue)))
                            {
                                User_Object_Attribute_Mapping_Enum userAttrEnum = User_Object_Attribute_Mapping_Enum_Converter.ToEnum(userAttribute2.ToUpper());
                                if (userAttrEnum != User_Object_Attribute_Mapping_Enum.NONE)
                                {
                                    Config.Add_Constant(userAttrEnum, constantValue);
                                }
                            }
                            break;

                        case "cansubmit":
                            string serverVariable2 = null;
                            string requiredValue = null;
                            if (subTreeReader.MoveToAttribute("ServerVariable"))
                                serverVariable2 = subTreeReader.Value.Trim();
                            if (subTreeReader.MoveToAttribute("Value"))
                                requiredValue = subTreeReader.Value.Trim();
                            if ((!String.IsNullOrEmpty(serverVariable2)) && (!String.IsNullOrEmpty(requiredValue)))
                            {
                                Config.Add_CanSubmit_Indicator(serverVariable2, requiredValue);
                            }
                            break;
                    }
                }
            }
        }
 public Authentication_Configuration()
 {
     Shibboleth = new Shibboleth_Configuration();
 }