Example #1
0
        private ICollection GetValidatedAdditionalDomains(AutodiscoverClient client, string applicationUri, StringList domains)
        {
            if (domains.Count <= 1)
            {
                return(domains);
            }
            int           num  = 25;
            int           num2 = 75 / (domains.Count - 1);
            List <string> list = new List <string>(domains.Count);

            foreach (string text in domains)
            {
                if (StringComparer.OrdinalIgnoreCase.Equals(this.DomainName.Domain, text))
                {
                    list.Add(text);
                }
                else
                {
                    base.WriteProgress(Strings.GetFederationInformationProgress, Strings.DiscoveringAdditionalDomain(text), num);
                    if (this.IsValidAdditionalDomain(client, applicationUri, text))
                    {
                        list.Add(text);
                    }
                    num += num2;
                    base.WriteProgress(Strings.GetFederationInformationProgress, Strings.DiscoveringAdditionalDomain(text), num);
                }
            }
            return(list);
        }
Example #2
0
        private Uri Discover()
        {
            string sharerIdentity = this.subscription.SharerIdentity;
            Uri    result;

            using (AutodiscoverClient autodiscoverClient = new AutodiscoverClient())
            {
                autodiscoverClient.RequestedServerVersion = DefaultBinding_Autodiscover.Exchange2010RequestedServerVersion;
                autodiscoverClient.Authenticator          = this.CreateAuthenticator(Offer.Autodiscover);
                autodiscoverClient.Proxy     = this.WebProxy;
                autodiscoverClient.UserAgent = "ExchangeSharingSync";
                ITopologyConfigurationSession topologyConfigurationSession = DirectorySessionFactory.Default.CreateTopologyConfigurationSession(ConsistencyMode.IgnoreInvalid, ADSessionSettings.FromRootOrgScopeSet(), 1351, "Discover", "f:\\15.00.1497\\sources\\dev\\infoworker\\src\\common\\Sharing\\SharingEngine.cs");
                string[] autodiscoverTrustedHosters = topologyConfigurationSession.GetAutodiscoverTrustedHosters();
                if (autodiscoverTrustedHosters != null)
                {
                    autodiscoverClient.AllowedHostnames.AddRange(autodiscoverTrustedHosters);
                }
                UserSettings userSettings = SharingEngine.SingleGetUserSettings.Discover(autodiscoverClient, sharerIdentity);
                if (userSettings.IsSettingError("ExternalEwsUrl"))
                {
                    SharingEngine.Tracer.TraceError <UserSettings>((long)this.GetHashCode(), "ExternalEwsUrl not present in response: {0}", userSettings);
                    throw new AutodiscoverException(Strings.UnexpectedUserResponses, userSettings);
                }
                UserSetting setting = userSettings.GetSetting("ExternalEwsUrl");
                if (setting == null)
                {
                    SharingEngine.Tracer.TraceError <UserSettings>((long)this.GetHashCode(), "ExternalEwsUrl not present in response: {0}", userSettings);
                    throw new AutodiscoverException(Strings.UnexpectedUserResponses, userSettings);
                }
                StringSetting stringSetting = setting as StringSetting;
                if (stringSetting == null)
                {
                    SharingEngine.Tracer.TraceError <Type>((long)this.GetHashCode(), "Unexpected type for ExternalEwsUrl in response. Type is {0}", setting.GetType());
                    throw new AutodiscoverException(Strings.UnexpectedUserResponses, userSettings);
                }
                if (string.IsNullOrEmpty(stringSetting.Value))
                {
                    SharingEngine.Tracer.TraceError((long)this.GetHashCode(), "Empty value returned for ExternalEwsUrl in response.");
                    throw new AutodiscoverException(Strings.UnexpectedUserResponses, userSettings);
                }
                if (!Uri.IsWellFormedUriString(stringSetting.Value, UriKind.Absolute))
                {
                    SharingEngine.Tracer.TraceError <string>((long)this.GetHashCode(), "Value returned for ExternalEwsUrl is not well-formed URL: {0}", stringSetting.Value);
                    throw new AutodiscoverException(Strings.UnexpectedUserResponses, userSettings);
                }
                Uri uri = new Uri(EwsWsSecurityUrl.Fix(stringSetting.Value));
                if (uri.Scheme != Uri.UriSchemeHttps)
                {
                    SharingEngine.Tracer.TraceError <string>((long)this.GetHashCode(), "Response has non-HTTPS ExternalEwsUrl: {0}", stringSetting.Value);
                    throw new AutodiscoverException(Strings.UnexpectedUserResponses, userSettings);
                }
                SharingEngine.Tracer.TraceDebug <Uri>((long)this.GetHashCode(), "Received valid response: {0}", uri);
                result = uri;
            }
            return(result);
        }
Example #3
0
        private bool IsValidAdditionalDomain(AutodiscoverClient client, string applicationUri, string domain)
        {
            IEnumerable <GetFederationInformationResult> results = GetFederationInformationClient.Discover(client, domain);
            GetFederationInformationResult successfulResult      = this.GetSuccessfulResult(results, domain);

            if (successfulResult == null || successfulResult.Type != AutodiscoverResult.Success)
            {
                base.WriteVerbose(Strings.DomainIgnoredBecauseUnableToDiscover(domain, GetFederationInformation.GetFormattedResults(results)));
                return(false);
            }
            if (!StringComparer.OrdinalIgnoreCase.Equals(applicationUri, successfulResult.ApplicationUri))
            {
                base.WriteVerbose(Strings.DomainIgnoredBecauseApplicationUriInconsitent(domain, successfulResult.ApplicationUri, applicationUri));
                return(false);
            }
            return(true);
        }
Example #4
0
        protected override TokenTarget CreateOnCacheMiss(string key, ref bool shouldAdd)
        {
            TargetUriViaGetFederationInformation.Tracer.TraceDebug <string>((long)this.GetHashCode(), "UriCache: cache miss for: {0}", key);
            ITopologyConfigurationSession topologyConfigurationSession = DirectorySessionFactory.Default.CreateTopologyConfigurationSession(ConsistencyMode.IgnoreInvalid, ADSessionSettings.FromRootOrgScopeSet(), 68, "CreateOnCacheMiss", "f:\\15.00.1497\\sources\\dev\\data\\src\\storage\\Sharing\\Authentication\\TargetUriViaGetFederationInformation.cs");

            string[] autodiscoverTrustedHosters = topologyConfigurationSession.GetAutodiscoverTrustedHosters();
            IEnumerable <GetFederationInformationResult> enumerable;

            using (AutodiscoverClient autodiscoverClient = new AutodiscoverClient())
            {
                Server localServer = LocalServerCache.LocalServer;
                if (localServer != null && localServer.InternetWebProxy != null)
                {
                    TargetUriViaGetFederationInformation.Tracer.TraceDebug <Uri>((long)this.GetHashCode(), "Using custom InternetWebProxy {0}.", localServer.InternetWebProxy);
                    autodiscoverClient.Proxy = new WebProxy(localServer.InternetWebProxy);
                }
                if (autodiscoverTrustedHosters != null)
                {
                    TargetUriViaGetFederationInformation.Tracer.TraceDebug <ArrayTracer <string> >((long)this.GetHashCode(), "Using trusted hostnames: {0}.", new ArrayTracer <string>(autodiscoverTrustedHosters));
                    autodiscoverClient.AllowedHostnames.AddRange(autodiscoverTrustedHosters);
                }
                enumerable = GetFederationInformationClient.Discover(autodiscoverClient, key);
            }
            foreach (GetFederationInformationResult getFederationInformationResult in enumerable)
            {
                if (getFederationInformationResult.Type == AutodiscoverResult.Success)
                {
                    TargetUriViaGetFederationInformation.Tracer.TraceDebug <string, string, Uri>(0L, "Autodiscover's GetFederationInformation returned ApplicationUri {0} for domain {1} using {2} URL", getFederationInformationResult.ApplicationUri, key, getFederationInformationResult.Url);
                    Uri uri = new Uri("http://" + getFederationInformationResult.ApplicationUri, UriKind.Absolute);
                    if (getFederationInformationResult.TokenIssuerUris != null && getFederationInformationResult.TokenIssuerUris.Length > 0)
                    {
                        Uri[] tokenIssuerUris = Array.ConvertAll <string, Uri>(getFederationInformationResult.TokenIssuerUris, (string tokenIssuerUri) => new Uri(tokenIssuerUri, UriKind.RelativeOrAbsolute));
                        return(new TokenTarget(uri, tokenIssuerUris));
                    }
                    return(new TokenTarget(uri));
                }
            }
            return(null);
        }
Example #5
0
        protected override void InternalProcessRecord()
        {
            TaskLogger.LogEnter();
            base.InternalProcessRecord();
            ITopologyConfigurationSession topologyConfigurationSession = DirectorySessionFactory.Default.CreateTopologyConfigurationSession(ConsistencyMode.IgnoreInvalid, ADSessionSettings.FromRootOrgScopeSet(), 66, "InternalProcessRecord", "f:\\15.00.1497\\sources\\dev\\Management\\src\\Management\\SystemConfigurationTasks\\Federation\\GetFederationInformation.cs");

            string[] autodiscoverTrustedHosters = topologyConfigurationSession.GetAutodiscoverTrustedHosters();
            using (AutodiscoverClient autodiscoverClient = new AutodiscoverClient())
            {
                Server localServer = LocalServerCache.LocalServer;
                if (localServer != null && localServer.InternetWebProxy != null)
                {
                    base.WriteVerbose(Strings.GetFederationInformationProxy(localServer.InternetWebProxy.ToString()));
                    autodiscoverClient.Proxy = new WebProxy(localServer.InternetWebProxy);
                }
                if (this.TrustedHostnames != null)
                {
                    autodiscoverClient.AllowedHostnames.AddRange(this.TrustedHostnames);
                }
                if (autodiscoverTrustedHosters != null)
                {
                    autodiscoverClient.AllowedHostnames.AddRange(autodiscoverTrustedHosters);
                }
                base.WriteVerbose(Strings.GetFederationInformationTrustedHostnames(autodiscoverClient.AllowedHostnames.ToString()));
                base.WriteProgress(Strings.GetFederationInformationProgress, Strings.DiscoveringDomain(this.DomainName.Domain), 5);
                List <GetFederationInformationResult> list = new List <GetFederationInformationResult>(GetFederationInformationClient.Discover(autodiscoverClient, this.DomainName.Domain));
                base.WriteProgress(Strings.GetFederationInformationProgress, Strings.DiscoveringDomain(this.DomainName.Domain), 25);
                base.WriteVerbose(Strings.GetFederationInformationResults(GetFederationInformation.GetFormattedResults(list)));
                GetFederationInformationResult result = this.GetResult(list);
                if (result == null)
                {
                    base.WriteError(new GetFederationInformationFailedException(list.ToArray()), (ErrorCategory)1001, null);
                }
                else
                {
                    ICollection domainNames;
                    if (this.BypassAdditionalDomainValidation)
                    {
                        domainNames = result.Domains;
                    }
                    else
                    {
                        domainNames = this.GetValidatedAdditionalDomains(autodiscoverClient, result.ApplicationUri, result.Domains);
                    }
                    if (result.TokenIssuerUris != null && result.TokenIssuerUris.Length > 0)
                    {
                        bool  flag  = false;
                        Uri[] array = Array.ConvertAll <string, Uri>(result.TokenIssuerUris, (string uri) => new Uri(uri, UriKind.RelativeOrAbsolute));
                        ExternalAuthentication current = ExternalAuthentication.GetCurrent();
                        if (current.Enabled)
                        {
                            foreach (SecurityTokenService securityTokenService in current.SecurityTokenServices)
                            {
                                Uri tokenIssuerUri = securityTokenService.TokenIssuerUri;
                                foreach (Uri uri2 in array)
                                {
                                    if (tokenIssuerUri.Equals(uri2))
                                    {
                                        base.WriteVerbose(Strings.GetFederationInformationTokenIssuerMatches(tokenIssuerUri.ToString(), uri2.ToString()));
                                        flag = true;
                                        break;
                                    }
                                    base.WriteVerbose(Strings.GetFederationInformationTokenIssuerDoesntMatch(tokenIssuerUri.ToString(), uri2.ToString()));
                                }
                            }
                            if (!flag)
                            {
                                StringBuilder stringBuilder = new StringBuilder(100);
                                foreach (SecurityTokenService securityTokenService2 in current.SecurityTokenServices)
                                {
                                    if (stringBuilder.Length > 0)
                                    {
                                        stringBuilder.Append(",");
                                    }
                                    stringBuilder.Append(securityTokenService2.TokenIssuerUri.ToString());
                                }
                                this.WriteWarning(Strings.GetFederationInformationTokenIssuerDoesntMatchAny(this.DomainName.ToString(), string.Join(",", result.TokenIssuerUris), stringBuilder.ToString()));
                            }
                        }
                    }
                    base.WriteObject(new FederationInformation(this.DomainName, new Uri(result.ApplicationUri, UriKind.RelativeOrAbsolute), result.TokenIssuerUris, domainNames, EwsWsSecurityUrl.Fix(result.Url)));
                }
                base.WriteProgress(Strings.GetFederationInformationProgress, Strings.ProgressStatusFinished, 100);
            }
            TaskLogger.LogExit();
        }