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); }
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); }
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); }
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); }
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(); }