public static void SetBasicAuth(this IISDeploymentParameters parameters, bool enabled = true)
        {
            parameters.EnableModule("BasicAuthenticationModule", "%IIS_BIN%\\authbas.dll");

            parameters.AddServerConfigAction(
                element =>
            {
                element
                .RequiredElement("system.webServer")
                .RequiredElement("security")
                .RequiredElement("authentication")
                .GetOrAdd("basicAuthentication")
                .SetAttributeValue("enabled", enabled);
            });
        }
        public static void SetWindowsAuth(this IISDeploymentParameters parameters, bool enabled = true)
        {
            parameters.EnsureSection("windowsAuthentication", "system.webServer", "security", "windowsAuthentication");
            parameters.EnableModule("WindowsAuthenticationModule", "%IIS_BIN%\\authsspi.dll");

            parameters.AddServerConfigAction(
                element =>
            {
                var windowsAuthentication = element
                                            .RequiredElement("system.webServer")
                                            .RequiredElement("security")
                                            .RequiredElement("authentication")
                                            .GetOrAdd("windowsAuthentication");

                windowsAuthentication.SetAttributeValue("enabled", enabled);
                var providers = windowsAuthentication.GetOrAdd("providers");
                providers.GetOrAdd("add", "value", "Negotiate");
                providers.GetOrAdd("add", "value", "NTLM");
            });
        }
        public static void EnableFreb(this IISDeploymentParameters deploymentParameters, string verbosity, string folderPath)
        {
            if (!deploymentParameters.PublishApplicationBeforeDeployment)
            {
                throw new InvalidOperationException("Testing freb requires site to be published.");
            }

            deploymentParameters.EnableModule("FailedRequestsTracingModule", "%IIS_BIN%\\iisfreb.dll");

            // Set the TraceFailedRequestsSection to listend to ANCM events
            deploymentParameters.ServerConfigActionList.Add(
                (element, _) =>
            {
                var webServerElement = element
                                       .RequiredElement("system.webServer");

                var addElement = webServerElement
                                 .GetOrAdd("tracing")
                                 .GetOrAdd("traceFailedRequests")
                                 .GetOrAdd("add");

                addElement.SetAttributeValue("path", "*");

                addElement.GetOrAdd("failureDefinitions")
                .SetAttributeValue("statusCodes", "200-999");

                var traceAreasElement = addElement
                                        .GetOrAdd("traceAreas");
                var innerAddElement = traceAreasElement.GetOrAdd("add", "provider", "WWW Server");

                innerAddElement.SetAttributeValue("areas", "ANCM");
                innerAddElement.SetAttributeValue("verbosity", verbosity);
            });

            // Set the ANCM traceProviderDefinition to 65536
            deploymentParameters.ServerConfigActionList.Add(
                (element, _) =>
            {
                var webServerElement = element
                                       .RequiredElement("system.webServer");

                var traceProviderDefinitionsElement = webServerElement
                                                      .GetOrAdd("tracing")
                                                      .GetOrAdd("traceProviderDefinitions");

                var innerAddElement = traceProviderDefinitionsElement.GetOrAdd("add", "name", "WWW Server");

                innerAddElement.SetAttributeValue("name", "WWW Server");
                innerAddElement.SetAttributeValue("guid", "{3a2a4e84-4c21-4981-ae10-3fda0d9b0f83}");

                var areasElement = innerAddElement.GetOrAdd("areas");
                var iae          = areasElement.GetOrAdd("add", "name", "ANCM");

                iae.SetAttributeValue("value", "65536");
            });

            // Set the freb directory to the published app directory.
            deploymentParameters.ServerConfigActionList.Add(
                (element, contentRoot) =>
            {
                var traceFailedRequestsElement = element
                                                 .RequiredElement("system.applicationHost")
                                                 .Element("sites")
                                                 .Element("siteDefaults")
                                                 .Element("traceFailedRequestsLogging");
                traceFailedRequestsElement.SetAttributeValue("directory", folderPath);
                traceFailedRequestsElement.SetAttributeValue("enabled", "true");
                traceFailedRequestsElement.SetAttributeValue("maxLogFileSizeKB", "1024");
            });
        }