public AuthenticationDomain AuthenticateOAuth(AuthenticationDomain domain)
        {
            var webDialogThread = new WebDialogThread(this, domain);
            var t = new Thread(webDialogThread.Run);

            t.SetApartmentState(ApartmentState.STA);
            t.Start();
            var ResultDomain = webDialogThread.Result;

            if (ResultDomain != null && ResultDomain.OAuthToken != null)
            {
                if (Domains.ContainsKey(ResultDomain.Uri))
                {
                    Domains.Remove(ResultDomain.Uri);
                }
                Domains.Add(ResultDomain.Uri, ResultDomain);
                PrimaryDomain = ResultDomain;
                Client.AddOAuthCredentials(new Uri(ResultDomain.Uri), ResultDomain.OAuthToken);
                Client.BaseUri = new Uri(ResultDomain.Uri);
                this.Save();
            }
            else
            {
                throw new Exception("Invalid Authentication");
            }
            return(ResultDomain);
        }
        public AuthenticationDomain AuthenticateUsernamePassword(string domain)
        {
            var dialog = new BasicAuthDialog(domain);
            var output = dialog.ShowDialog();

            if (output == System.Windows.Forms.DialogResult.OK)
            {
                var authDomain = new AuthenticationDomain()
                {
                    Uri = domain
                };
                if (authDomain.Provider.Equals(Resources.ShareFileProvider) && authDomain.IsShareFileUri)
                {
                    authDomain = AuthenticateUsernamePassword(authDomain.Account, authDomain.Domain, dialog.Username, dialog.Password);
                }
                else
                {
                    authDomain.Credential = new NetworkCredential(dialog.Username, dialog.Password);
                    if (Client == null)
                    {
                        Client = CreateClient(authDomain);
                    }
                    Client.AddCredentials(new Uri(authDomain.Uri), "basic", authDomain.Credential);
                }
                if (Domains.ContainsKey(authDomain.Uri))
                {
                    Domains.Remove(authDomain.Uri);
                }
                Domains.Add(authDomain.Uri, authDomain);
                Save();
                return(authDomain);
            }
            return(null);
        }
        public AuthenticationDomain AuthenticateForms(AuthenticationDomain domain, Uri formUri, Uri tokenUri, string root)
        {
            var webDialogThread = new WebDialogThread(this, domain, formUri, tokenUri, root);
            var t = new Thread(webDialogThread.Run);

            t.SetApartmentState(ApartmentState.STA);
            t.Start();
            var ResultDomain = webDialogThread.Result;

            if (ResultDomain != null && (ResultDomain.OAuthToken != null || ResultDomain.AuthID != null))
            {
                if (Domains.ContainsKey(ResultDomain.Uri))
                {
                    Domains.Remove(ResultDomain.Uri);
                }
                Domains.Add(ResultDomain.Uri, ResultDomain);
                Client.AddAuthenticationId(new Uri(ResultDomain.Uri), ResultDomain.AuthID);
                Client.BaseUri = new Uri(ResultDomain.Uri);
                this.Save();
            }
            else
            {
                throw new Exception("Invalid Authentication");
            }
            return(ResultDomain);
        }
Exemplo n.º 4
0
        protected override void ProcessRecord()
        {
            if (ApiVersion == null)
            {
                ApiVersion = Resources.DefaultApiVersion;
            }
            if (Domain == null)
            {
                Domain = Resources.DefaultApiDomain;
            }
            if (Account == null)
            {
                Account = Resources.DefaultGlobalApiSubdomain;
            }
            if (Provider == null)
            {
                Provider = Resources.ShareFileProvider;
            }
            var authDomain = new AuthenticationDomain()
            {
                Account    = Account,
                Domain     = Domain,
                ApiVersion = ApiVersion,
                Provider   = Provider
            };

            authDomain.Credential = Credential != null?Credential.GetNetworkCredential() : null;

            PSShareFileClient psc = new PSShareFileClient(Name, authDomain);

            psc.GetSession();
            WriteObject(psc);
        }
 public WebDialogThread(PSShareFileClient psClient, AuthenticationDomain domain, Uri formUri = null, Uri tokenUri = null, string root = null)
 {
     _psClient      = psClient;
     _requestDomain = domain;
     _formUri       = formUri;
     _tokenUri      = tokenUri;
     _root          = root;
 }
Exemplo n.º 6
0
            public void Run()
            {
                AuthenticationDomain authDomain = null;
                var browser = new OAuthAuthenticationForm();

                browser.AddUrlEventHandler(Resources.RedirectURL, uri =>
                {
                    try
                    {
                        // return is <redirect_url>/oauth/authorize#access_token=...&subdomain=...&apicp=...&appcp=...
                        var query        = new Dictionary <string, string>();
                        OAuthToken token = null;
                        if (!string.IsNullOrEmpty(uri.Query))
                        {
                            foreach (var kvp in uri.Query.Substring(1).Split('&'))
                            {
                                var kvpSplit = kvp.Split('=');
                                if (kvpSplit.Length == 2)
                                {
                                    query.Add(kvpSplit[0], kvpSplit[1]);
                                }
                            }
                            var subdomain = query["subdomain"];
                            var apiCP     = query["apicp"];
                            var appCP     = query["appcp"];

                            token = _psClient.GetTokenResponse(
                                string.Format("https://{0}.{1}/oauth/token", subdomain, appCP),
                                string.Format("grant_type=authorization_code&code={0}&client_id={1}&client_secret={2}&requirev3=true", query["code"],
                                              Resources.ClientId, Resources.ClientSecret));

                            authDomain                   = new AuthenticationDomain();
                            authDomain.OAuthToken        = token.AccessToken;
                            authDomain.OAuthRefreshToken = token.RefreshToken;
                            authDomain.Account           = token.Subdomain;
                            authDomain.Provider          = Resources.ShareFileProvider;
                            authDomain.Domain            = token.ApiCP;
                            authDomain.ApiVersion        = Resources.DefaultApiVersion;
                            return(true);
                        }
                        else
                        {
                            return(false);
                        }
                    }
                    catch (Exception)
                    {
                        return(true);
                    }
                });
                browser.Navigate(new Uri(string.Format("https://{0}.{1}/oauth/authorize?response_type=code&client_id={2}&redirect_uri={3}&autoredirect=true",
                                                       _requestDomain.Account != null ? _requestDomain.Account : "secure",
                                                       _requestDomain.Domain,
                                                       Resources.ClientId,
                                                       Uri.EscapeUriString(Resources.RedirectURL))));
                _result = authDomain;
                _waitHandle.Set();
            }
 public PSShareFileClient(string path, AuthenticationDomain domain = null)
 {
     Path    = path;
     Domains = new Dictionary <string, AuthenticationDomain>();
     if (domain != null)
     {
         Domains.Add(domain.Uri, domain);
         PrimaryDomain = domain;
     }
 }
 public PSShareFileClient(string path, AuthenticationDomain domain = null)
 {
     Path = path;
     Domains = new Dictionary<string, AuthenticationDomain>();
     if (domain != null)
     {
         Domains.Add(domain.Uri, domain);
         PrimaryDomain = domain;
     }
 }
        private ShareFileClient CreateClient(AuthenticationDomain domain)
        {
            var client = new ShareFileClient(domain.Uri);

            if (domain.OAuthToken != null)
            {
                client.AddOAuthCredentials(new Uri(domain.Uri), domain.OAuthToken);
            }
            client.AddExceptionHandler(OnException);
            client.AddChangeDomainHandler(OnDomainChange);
            return(client);
        }
        private ShareFileClient CreateClient(AuthenticationDomain domain)
        {
            Configuration config = Configuration.Default();

            config.HttpTimeout = 200000;
            var client = new ShareFileClient(domain.Uri, config);

            if (domain.OAuthToken != null)
            {
                client.AddOAuthCredentials(new Uri(domain.Uri), domain.OAuthToken);
            }
            client.AddExceptionHandler(OnException);
            client.AddChangeDomainHandler(OnDomainChange);
            return(client);
        }
Exemplo n.º 11
0
 protected override void ProcessRecord()
 {
     if (ApiVersion == null) ApiVersion = Resources.DefaultApiVersion;
     if (Domain == null) Domain = Resources.DefaultApiDomain;
     if (Account == null) Account = Resources.DefaultGlobalApiSubdomain;
     if (Provider == null) Provider = Resources.ShareFileProvider;
     var authDomain = new AuthenticationDomain()
     {
         Account = Account,
         Domain = Domain,
         ApiVersion = ApiVersion,
         Provider = Provider,
         Username = Email
     };
     authDomain.Credential = Credential != null ? Credential.GetNetworkCredential() : null;
     PSShareFileClient psc = new PSShareFileClient(Name, authDomain);
     psc.GetSession();
     WriteObject(psc);
 }
        /// <summary>
        /// Callback method for Redirection events received by the ShareFile Client SDK
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <param name="redirection"></param>
        /// <returns></returns>
        private EventHandlerResponse OnDomainChange(HttpRequestMessage requestMessage, Redirection redirection)
        {
            // Check if we already have a session on the target
            bool hasSession = true;

            if (redirection.SessionCheck)
            {
                hasSession = false;
                try
                {
                    var query = new ShareFile.Api.Client.Requests.Query <Session>(Client);
                    query.Uri(new Uri(redirection.SessionUri.ToString() + "?root=" + redirection.Root));
                    var session = query.Execute();
                    hasSession = true;
                }
                catch (Exception)
                { }
            }
            // If we're not authenticated, we have to authenticate now using Forms
            if (!hasSession && redirection.FormsUri != null)
            {
                var authDomain = new AuthenticationDomain()
                {
                    Uri = redirection.SessionUri.ToString()
                };
                authDomain = this.AuthenticateForms(authDomain,
                                                    new Uri(string.Format("{0}?root={1}&redirect_url={2}", redirection.FormsUri, redirection.Root, Uri.EscapeUriString(Resources.RedirectURL))),
                                                    redirection.TokenUri,
                                                    redirection.Root);
                if (authDomain.OAuthToken == null)
                {
                    return(new EventHandlerResponse()
                    {
                        Action = EventHandlerResponseAction.Throw
                    });
                }
            }
            return(new EventHandlerResponse()
            {
                Action = EventHandlerResponseAction.Redirect, Redirection = redirection
            });
        }
        public AuthenticationDomain AuthenticateUsernamePassword(string account, string domain, string username, string password)
        {
            AuthenticationDomain authDomain = null;
            var accountAndDomain            = string.IsNullOrEmpty(account) ? domain : string.Format("{0}.{1}", account, domain);
            var uri     = string.Format("https://{0}/oauth/token", accountAndDomain);
            var request = HttpWebRequest.CreateHttp(uri);

            request.Method      = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            using (var body = new StreamWriter(request.GetRequestStream()))
            {
                body.Write(
                    Uri.EscapeUriString(string.Format("grant_type=password&client_id={0}&client_secret={1}&username={2}&password={3}",
                                                      Resources.ClientId,
                                                      Resources.ClientSecret,
                                                      username,
                                                      password)));
            }
            var response = (HttpWebResponse)request.GetResponse();

            using (var body = new StreamReader(response.GetResponseStream()))
            {
                var jobj = JsonConvert.DeserializeObject <JObject>(body.ReadToEnd());
                authDomain            = new AuthenticationDomain();
                authDomain.OAuthToken = jobj["access_token"] != null ? jobj["access_token"].ToString() : null;
                uri            = string.Format("https://{0}/{1}/{2}", accountAndDomain, Resources.ShareFileProvider, Resources.DefaultApiVersion);
                authDomain.Uri = uri;
                if (Domains.ContainsKey(authDomain.Uri))
                {
                    Domains.Remove(authDomain.Uri);
                }
                Domains.Add(authDomain.Uri, authDomain);
                if (Client == null)
                {
                    Client = CreateClient(authDomain);
                }
                var session = Client.Sessions.Get().Execute();
                authDomain.AuthID = session.Id;
                this.Save();
            }
            return(authDomain);
        }
 public AuthenticationDomain AuthenticateUsernamePassword(string domain)
 {
     var dialog = new BasicAuthDialog(domain);
     var output = dialog.ShowDialog();
     if (output == System.Windows.Forms.DialogResult.OK)
     {
         var authDomain = new AuthenticationDomain() { Uri = domain };
         if (authDomain.Provider.Equals(Resources.ShareFileProvider) && authDomain.IsShareFileUri)
         {
             authDomain = AuthenticateUsernamePassword(authDomain.Account, authDomain.Domain, dialog.Username, dialog.Password);
         }
         else
         {
             authDomain.Credential = new NetworkCredential(dialog.Username, dialog.Password);
             if (Client == null) Client = CreateClient(authDomain);
             Client.AddCredentials(new Uri(authDomain.Uri), "basic", authDomain.Credential);
         }
         if (Domains.ContainsKey(authDomain.Uri)) Domains.Remove(authDomain.Uri);
         Domains.Add(authDomain.Uri, authDomain);
         Save();
         return authDomain;
     }
     return null;
 }
 public AuthenticationDomain AuthenticateOAuth(AuthenticationDomain domain)
 {
     var webDialogThread = new WebDialogThread(this, domain);
     var t = new Thread(webDialogThread.Run);
     t.SetApartmentState(ApartmentState.STA);
     t.Start();
     var ResultDomain = webDialogThread.Result;
     if (ResultDomain != null && ResultDomain.OAuthToken != null)
     {
         if (Domains.ContainsKey(ResultDomain.Uri)) Domains.Remove(ResultDomain.Uri);
         Domains.Add(ResultDomain.Uri, ResultDomain);
         PrimaryDomain = ResultDomain;
         Client.AddOAuthCredentials(new Uri(ResultDomain.Uri), ResultDomain.OAuthToken);
         Client.BaseUri = new Uri(ResultDomain.Uri);
         this.Save();
     }
     else throw new Exception("Invalid Authentication");
     return ResultDomain;
 }
 public AuthenticationDomain AuthenticateForms(AuthenticationDomain domain, Uri formUri, Uri tokenUri, string root)
 {
     var webDialogThread = new WebDialogThread(this, domain, formUri, tokenUri, root);
     var t = new Thread(webDialogThread.Run);
     t.SetApartmentState(ApartmentState.STA);
     t.Start();
     var ResultDomain = webDialogThread.Result;
     if (ResultDomain != null && (ResultDomain.OAuthToken != null || ResultDomain.AuthID != null))
     {
         if (Domains.ContainsKey(ResultDomain.Uri)) Domains.Remove(ResultDomain.Uri);
         Domains.Add(ResultDomain.Uri, ResultDomain);
         Client.AddAuthenticationId(new Uri(ResultDomain.Uri), ResultDomain.AuthID);
         Client.BaseUri = new Uri(ResultDomain.Uri);
         this.Save();
     }
     else throw new Exception("Invalid Authentication");
     return ResultDomain;
 }
 public void Load()
 {
     using (var reader = new StreamReader(new FileStream(Path, FileMode.Open)))
     {
         AuthenticationDomain domain = null;
         while (!reader.EndOfStream)
         {
             var line = reader.ReadLine();
             if (line != null)
             {
                 line = line.Trim();
                 if (line.StartsWith("["))
                 {
                     if (domain != null)
                     {
                         Domains.Add(domain.Id, domain);
                     }
                     domain    = new AuthenticationDomain();
                     domain.Id = line.Substring(1, line.IndexOf(']') - 1);
                 }
                 else if (line.StartsWith("Provider"))
                 {
                     domain.Provider = line.Split('=')[1].Trim();
                 }
                 else if (line.StartsWith("IsDefault"))
                 {
                     domain.IsDefault = bool.Parse(line.Split('=')[1].Trim());
                 }
                 else if (line.StartsWith("Uri"))
                 {
                     domain.Uri = line.Split('=')[1].Trim();
                 }
                 else if (line.StartsWith("AccessToken"))
                 {
                     domain.OAuthToken = line.Split('=')[1].Trim();
                 }
                 else if (line.StartsWith("RefreshToken"))
                 {
                     domain.OAuthRefreshToken = line.Split('=')[1].Trim();
                 }
                 else if (line.StartsWith("Account"))
                 {
                     domain.Account = line.Split('=')[1].Trim();
                 }
                 else if (line.StartsWith("Domain"))
                 {
                     domain.Domain = line.Split('=')[1].Trim();
                 }
                 else if (line.StartsWith("ApiVersion"))
                 {
                     domain.ApiVersion = line.Split('=')[1].Trim();
                 }
                 else if (line.StartsWith("NetworkCredential"))
                 {
                     string cred     = line.Split('=')[1].Trim();
                     string username = cred.Split(',')[0].Trim();
                     string password = cred.Split(',')[1].Trim();
                     domain.Credential = new NetworkCredential(username, password);
                 }
             }
         }
         if (domain != null)
         {
             Domains.Add(domain.Id, domain);
         }
     }
     // Load the default auth domain
     foreach (var id in Domains.Keys)
     {
         if (Domains[id].IsDefault)
         {
             Client        = CreateClient(Domains[id]);
             PrimaryDomain = Domains[id];
             if (!string.IsNullOrEmpty(Domains[id].OAuthToken))
             {
                 Client.AddOAuthCredentials(new Uri(Domains[id].Uri), Domains[id].OAuthToken);
             }
             break;
         }
     }
 }
        /// <summary>
        /// Callback method for exceptions received from the ShareFile SDK Client.
        /// </summary>
        /// <remarks>
        /// This method handles authorization exceptions raised by the ShareFile Client, allowing this Powershell
        /// provider to navigate multiple authentication domains.
        /// </remarks>
        /// <param name="response">Http response message that raised the exception</param>
        /// <param name="retryCount">Number of retries on the same SDK request</param>
        /// <returns>An EventHandlerResponse indicating the action the SDK should take - retry, throw or redirect</returns>
        private EventHandlerResponse OnException(HttpResponseMessage response, int retryCount)
        {
            if (retryCount > int.Parse(Resources.MaxExceptionRetry))
            {
                return(new EventHandlerResponse()
                {
                    Action = EventHandlerResponseAction.Throw
                });
            }
            AuthenticationDomain authDomain = null;

            if (response.StatusCode == HttpStatusCode.Unauthorized)
            {
                // Check cached credentials for this API domain
                foreach (var id in Domains.Keys)
                {
                    if (response.RequestMessage.RequestUri.Host.EndsWith(new Uri(Domains[id].Uri).Host))
                    {
                        authDomain = Domains[id];
                        if (!string.IsNullOrEmpty(Domains[id].OAuthRefreshToken))
                        {
                            var token = GetTokenResponse(
                                "POST",
                                string.Format("https://{0}.{1}/oauth/token", Domains[id].Account, Domains[id].Domain),
                                string.Format("grant_type=refresh_token&redirect_uri={0}&refresh_token={1}&client_id={2}&client_secret={3}",
                                              Resources.RedirectURL, Domains[id].OAuthRefreshToken, Resources.ClientId, Resources.ClientSecret));
                            Domains[id].OAuthToken        = token.AccessToken;
                            Domains[id].OAuthRefreshToken = token.RefreshToken;
                            Client.AddOAuthCredentials(new Uri(Domains[id].Uri), token.AccessToken);
                            Save();
                            return(new EventHandlerResponse()
                            {
                                Action = EventHandlerResponseAction.Retry
                            });
                        }
                        else if (Domains[id].Credential != null && retryCount <= 1)
                        {
                            if (Domains[id].Provider.Equals(Resources.ShareFileProvider) && Domains[id].IsShareFileUri)
                            {
                                Domains[id] = AuthenticateUsernamePassword(Domains[id].Account, Domains[id].Domain, Domains[id].Credential.UserName, Domains[id].Credential.Password);
                            }
                            else
                            {
                                Client.AddCredentials(new Uri(Domains[id].Uri), "basic", Domains[id].Credential);
                            }
                            return(new EventHandlerResponse()
                            {
                                Action = EventHandlerResponseAction.Retry
                            });
                        }
                    }
                }
                // No cached, or bad cached credentials for this domain request
                // Check the headers for authentication challenges
                if (authDomain == null)
                {
                    authDomain = new AuthenticationDomain()
                    {
                        Uri = response.RequestMessage.RequestUri.ToString()
                    }
                }
                ;
                IEnumerable <string> values = null;
                if (response.Headers.TryGetValues("WWW-Authenticate", out values))
                {
                    foreach (var authMethodString in values)
                    {
                        var authMethodParts = authMethodString.Split(' ');
                        var authMethod      = authMethodParts[0].Trim();
                        if (authMethod.Equals("Bearer"))
                        {
                            authDomain = this.AuthenticateOAuth(authDomain);
                            return(new EventHandlerResponse()
                            {
                                Action = authDomain != null ? EventHandlerResponseAction.Retry : EventHandlerResponseAction.Throw
                            });
                        }
                        else if (retryCount == 0 && (authMethod.Equals("NTLM") || authMethod.Equals("Kerberos")))
                        {
                            // if retryCount > 0, then Network Credentials failed at least once;
                            // causes fallback to username/password
                            Client.AddCredentials(new Uri(authDomain.Uri), authMethod, CredentialCache.DefaultNetworkCredentials);
                            return(new EventHandlerResponse()
                            {
                                Action = EventHandlerResponseAction.Retry
                            });
                        }
                        else if (authMethod.Equals("Basic") || authMethod.Equals("NTLM"))
                        {
                            authDomain = this.AuthenticateUsernamePassword(authDomain.Uri);
                            return(new EventHandlerResponse()
                            {
                                Action = authDomain != null ? EventHandlerResponseAction.Retry : EventHandlerResponseAction.Throw
                            });
                        }
                    }
                }
            }
            return(new EventHandlerResponse()
            {
                Action = EventHandlerResponseAction.Throw
            });
        }
 private ShareFileClient CreateClient(AuthenticationDomain domain)
 {
     var client = new ShareFileClient(domain.Uri);
     if (domain.OAuthToken != null)
     {
         client.AddOAuthCredentials(new Uri(domain.Uri), domain.OAuthToken);
     }
     client.AddExceptionHandler(OnException);
     client.AddChangeDomainHandler(OnDomainChange);
     return client;
 }
 /// <summary>
 /// Callback method for exceptions received from the ShareFile SDK Client.
 /// </summary>
 /// <remarks>
 /// This method handles authorization exceptions raised by the ShareFile Client, allowing this Powershell
 /// provider to navigate multiple authentication domains. 
 /// </remarks>
 /// <param name="response">Http response message that raised the exception</param>
 /// <param name="retryCount">Number of retries on the same SDK request</param>
 /// <returns>An EventHandlerResponse indicating the action the SDK should take - retry, throw or redirect</returns>
 private EventHandlerResponse OnException(HttpResponseMessage response, int retryCount)
 {
     if (retryCount > int.Parse(Resources.MaxExceptionRetry))
     {
         return new EventHandlerResponse() { Action = EventHandlerResponseAction.Throw };
     }
     AuthenticationDomain authDomain = null;
     if (response.StatusCode == HttpStatusCode.Unauthorized)
     {
         // Check cached credentials for this API domain
         foreach (var id in Domains.Keys)
         {
             if (response.RequestMessage.RequestUri.Host.EndsWith(new Uri(Domains[id].Uri).Host))
             {
                 authDomain = Domains[id];
                 if (!string.IsNullOrEmpty(Domains[id].OAuthRefreshToken))
                 {
                     var token = GetTokenResponse(
                         "POST",
                         string.Format("https://{0}.{1}/oauth/token", Domains[id].Account, Domains[id].Domain),
                         string.Format("grant_type=refresh_token&redirect_uri={0}&refresh_token={1}&client_id={2}&client_secret={3}",
                             Resources.RedirectURL, Domains[id].OAuthRefreshToken, Resources.ClientId, Resources.ClientSecret));
                     Domains[id].OAuthToken = token.AccessToken;
                     Domains[id].OAuthRefreshToken = token.RefreshToken;
                     Client.AddOAuthCredentials(new Uri(Domains[id].Uri), token.AccessToken);
                     Save();
                     return new EventHandlerResponse() { Action = EventHandlerResponseAction.Retry };
                 }
                 else if (Domains[id].Credential != null && retryCount <= 1)
                 {
                     if (Domains[id].Provider.Equals(Resources.ShareFileProvider) && Domains[id].IsShareFileUri)
                     {
                         Domains[id] = AuthenticateUsernamePassword(Domains[id].Account, Domains[id].Domain, Domains[id].Credential.UserName, Domains[id].Credential.Password);
                     }
                     else
                     {
                         Client.AddCredentials(new Uri(Domains[id].Uri), "basic", Domains[id].Credential);
                     }
                     return new EventHandlerResponse() { Action = EventHandlerResponseAction.Retry };
                 }
             }
         }
         // No cached, or bad cached credentials for this domain request
         // Check the headers for authentication challenges
         if (authDomain == null) authDomain = new AuthenticationDomain() { Uri = response.RequestMessage.RequestUri.ToString() };
         IEnumerable<string> values = null;
         if (response.Headers.TryGetValues("WWW-Authenticate", out values))
         {
             foreach (var authMethodString in values)
             {
                 var authMethodParts = authMethodString.Split(' ');
                 var authMethod = authMethodParts[0].Trim();
                 if (authMethod.Equals("Bearer"))
                 {
                     authDomain = this.AuthenticateOAuth(authDomain);
                     return new EventHandlerResponse() { Action = authDomain != null ? EventHandlerResponseAction.Retry : EventHandlerResponseAction.Throw };
                 }
                 else if (retryCount == 0 && (authMethod.Equals("NTLM") || authMethod.Equals("Kerberos")))
                 {
                     // if retryCount > 0, then Network Credentials failed at least once; 
                     // causes fallback to username/password 
                     Client.AddCredentials(new Uri(authDomain.Uri), authMethod, CredentialCache.DefaultNetworkCredentials);
                     return new EventHandlerResponse() { Action = EventHandlerResponseAction.Retry };
                 }
                 else if (authMethod.Equals("Basic") || authMethod.Equals("NTLM"))
                 {
                     authDomain = this.AuthenticateUsernamePassword(authDomain.Uri);
                     return new EventHandlerResponse() { Action = authDomain != null ? EventHandlerResponseAction.Retry : EventHandlerResponseAction.Throw };
                 }
             }
         }
     }
     return new EventHandlerResponse() { Action = EventHandlerResponseAction.Throw };
 }
Exemplo n.º 21
0
 public WebDialogThread(PSShareFileClient psClient, AuthenticationDomain domain)
 {
     _psClient      = psClient;
     _requestDomain = domain;
 }
            public void Run()
            {
                AuthenticationDomain authDomain = null;
                var browser = new OAuthAuthenticationForm();
                Uri requestUri = null;
                if (_formUri == null)
                {
                    requestUri = new Uri(string.Format("https://{0}.{1}/oauth/authorize?response_type=code&client_id={2}{3}{4}&redirect_uri={5}",
                        _requestDomain.Account ?? "secure",
                        _requestDomain.Domain,
                        Resources.ClientId,
                        _requestDomain.Account != null && !_requestDomain.Account.Equals("secure") ? "&subdomain=" + _requestDomain.Account : "",
                        _requestDomain.Username != null ? "&username="******"",
                        Uri.EscapeUriString(Resources.RedirectURL)));

                    browser.AddUrlEventHandler(Resources.RedirectURL, uri =>
                    {
                        try
                        {
                            // return is <redirect_url>/oauth/authorize#access_token=...&subdomain=...&apicp=...&appcp=...
                            var query = new Dictionary<string, string>();
                            OAuthToken token = null;
                            if (!string.IsNullOrEmpty(uri.Query))
                            {
                                foreach (var kvp in uri.Query.Substring(1).Split('&'))
                                {
                                    var kvpSplit = kvp.Split('=');
                                    if (kvpSplit.Length == 2) query.Add(kvpSplit[0], kvpSplit[1]);
                                }
                                var subdomain = query["subdomain"];
                                var apiCP = query["apicp"];
                                var appCP = query["appcp"];

                                token = _psClient.GetTokenResponse(
                                    "POST",
                                    string.Format("https://{0}.{1}/oauth/token", subdomain, appCP),
                                    string.Format("grant_type=authorization_code&code={0}&client_id={1}&client_secret={2}&requirev3=true", query["code"],
                                        Resources.ClientId, Resources.ClientSecret));

                                authDomain = new AuthenticationDomain();
                                authDomain.OAuthToken = token.AccessToken;
                                authDomain.OAuthRefreshToken = token.RefreshToken;
                                authDomain.Account = token.Subdomain;
                                authDomain.Provider = Resources.ShareFileProvider;
                                authDomain.Domain = token.ApiCP;
                                authDomain.ApiVersion = Resources.DefaultApiVersion;
                                return true;
                            }
                            else return false;
                        }
                        catch (Exception)
                        {
                            return true;
                        }
                    });
                }
                else
                {
                    requestUri = _formUri;
                    browser.AddUrlEventHandler(Resources.RedirectURL, uri =>
                    {
                        var query = new Dictionary<string, string>();
                        if (!string.IsNullOrEmpty(uri.Query))
                        {
                            foreach (var kvp in uri.Query.Substring(1).Split('&'))
                            {
                                var kvpSplit = kvp.Split('=');
                                if (kvpSplit.Length == 2) query.Add(kvpSplit[0], kvpSplit[1]);
                            }
                            var request = HttpWebRequest.CreateHttp(_tokenUri.ToString() + string.Format("?root={0}&code={1}", _root, query["code"]));
                            var response = (HttpWebResponse)request.GetResponse();
                            Session session = null;
                            using (var reader = new StreamReader(response.GetResponseStream()))
                            {
                                session = JsonConvert.DeserializeObject<Session>(reader.ReadToEnd());
                            }
                            authDomain = new AuthenticationDomain();
                            authDomain.AuthID = session.Id;
                            authDomain.Uri = uri.ToString();
                            return true;
                        }
                        else return false;
                    });
                }
                browser.Navigate(requestUri);
                _result = authDomain;
                _waitHandle.Set();
            }
 public WebDialogThread(PSShareFileClient psClient, AuthenticationDomain domain, Uri formUri = null, Uri tokenUri = null, string root = null)
 {
     _psClient = psClient;
     _requestDomain = domain;
     _formUri = formUri;
     _tokenUri = tokenUri;
     _root = root;
 }
            public void Run()
            {
                AuthenticationDomain authDomain = null;
                var browser    = new OAuthAuthenticationForm();
                Uri requestUri = null;

                if (_formUri == null)
                {
                    requestUri = new Uri(string.Format("https://{0}.{1}/oauth/authorize?response_type=code&client_id={2}{3}{4}&redirect_uri={5}",
                                                       _requestDomain.Account ?? "secure",
                                                       _requestDomain.Domain,
                                                       Resources.ClientId,
                                                       _requestDomain.Account != null && !_requestDomain.Account.Equals("secure") ? "&subdomain=" + _requestDomain.Account : "",
                                                       _requestDomain.Username != null ? "&username="******"",
                                                       Uri.EscapeUriString(Resources.RedirectURL)));

                    browser.AddUrlEventHandler(Resources.RedirectURL, uri =>
                    {
                        try
                        {
                            // return is <redirect_url>/oauth/authorize#access_token=...&subdomain=...&apicp=...&appcp=...
                            var query        = new Dictionary <string, string>();
                            OAuthToken token = null;
                            if (!string.IsNullOrEmpty(uri.Query))
                            {
                                foreach (var kvp in uri.Query.Substring(1).Split('&'))
                                {
                                    var kvpSplit = kvp.Split('=');
                                    if (kvpSplit.Length == 2)
                                    {
                                        query.Add(kvpSplit[0], kvpSplit[1]);
                                    }
                                }
                                var subdomain = query["subdomain"];
                                var apiCP     = query["apicp"];
                                var appCP     = query["appcp"];

                                token = _psClient.GetTokenResponse(
                                    "POST",
                                    string.Format("https://{0}.{1}/oauth/token", subdomain, appCP),
                                    string.Format("grant_type=authorization_code&code={0}&client_id={1}&client_secret={2}&requirev3=true", query["code"],
                                                  Resources.ClientId, Resources.ClientSecret));

                                authDomain                   = new AuthenticationDomain();
                                authDomain.OAuthToken        = token.AccessToken;
                                authDomain.OAuthRefreshToken = token.RefreshToken;
                                authDomain.Account           = token.Subdomain;
                                authDomain.Provider          = Resources.ShareFileProvider;
                                authDomain.Domain            = token.ApiCP;
                                authDomain.ApiVersion        = Resources.DefaultApiVersion;
                                return(true);
                            }
                            else
                            {
                                return(false);
                            }
                        }
                        catch (Exception)
                        {
                            return(true);
                        }
                    });
                }
                else
                {
                    requestUri = _formUri;
                    browser.AddUrlEventHandler(Resources.RedirectURL, uri =>
                    {
                        var query = new Dictionary <string, string>();
                        if (!string.IsNullOrEmpty(uri.Query))
                        {
                            foreach (var kvp in uri.Query.Substring(1).Split('&'))
                            {
                                var kvpSplit = kvp.Split('=');
                                if (kvpSplit.Length == 2)
                                {
                                    query.Add(kvpSplit[0], kvpSplit[1]);
                                }
                            }
                            var request     = HttpWebRequest.CreateHttp(_tokenUri.ToString() + string.Format("?root={0}&code={1}", _root, query["code"]));
                            var response    = (HttpWebResponse)request.GetResponse();
                            Session session = null;
                            using (var reader = new StreamReader(response.GetResponseStream()))
                            {
                                session = JsonConvert.DeserializeObject <Session>(reader.ReadToEnd());
                            }
                            authDomain        = new AuthenticationDomain();
                            authDomain.AuthID = session.Id;
                            authDomain.Uri    = uri.ToString();
                            return(true);
                        }
                        else
                        {
                            return(false);
                        }
                    });
                }
                browser.Navigate(requestUri);
                _result = authDomain;
                _waitHandle.Set();
            }
        public AuthenticationDomain AuthenticateUsernamePassword(string account, string domain, string username, string password)
        {
            AuthenticationDomain authDomain = null;
            var accountAndDomain = string.IsNullOrEmpty(account) ? domain : string.Format("{0}.{1}", account, domain);
            var uri = string.Format("https://{0}/oauth/token", accountAndDomain);
            var request = HttpWebRequest.CreateHttp(uri);
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            using (var body = new StreamWriter(request.GetRequestStream()))
            {

                body.Write(
                    Uri.EscapeUriString(string.Format("grant_type=password&client_id={0}&client_secret={1}&username={2}&password={3}",
                    Resources.ClientId,
                    Resources.ClientSecret,
                    username,
                    password)));
            }
            var response = (HttpWebResponse)request.GetResponse();
            using (var body = new StreamReader(response.GetResponseStream()))
            {
                var jobj = JsonConvert.DeserializeObject<JObject>(body.ReadToEnd());
                authDomain = new AuthenticationDomain();
                authDomain.OAuthToken = jobj["access_token"] != null ? jobj["access_token"].ToString() : null;
                uri = string.Format("https://{0}/{1}/{2}", accountAndDomain, Resources.ShareFileProvider, Resources.DefaultApiVersion);
                authDomain.Uri = uri;
                if (Domains.ContainsKey(authDomain.Uri)) Domains.Remove(authDomain.Uri);
                Domains.Add(authDomain.Uri, authDomain);
                if (Client == null) Client = CreateClient(authDomain);
                var session = Client.Sessions.Get().Execute();
                authDomain.AuthID = session.Id;
                this.Save();
            }
            return authDomain;
        }
 /// <summary>
 /// Callback method for Redirection events received by the ShareFile Client SDK
 /// </summary>
 /// <param name="requestMessage"></param>
 /// <param name="redirection"></param>
 /// <returns></returns>
 private EventHandlerResponse OnDomainChange(HttpRequestMessage requestMessage, Redirection redirection)
 {
     // Check if we already have a session on the target 
     bool hasSession = true;
     if (redirection.SessionCheck)
     {
         hasSession = false;
         try
         {
             var query = new ShareFile.Api.Client.Requests.Query<Session>(Client);
             query.Uri(new Uri(redirection.SessionUri.ToString() + "?root=" + redirection.Root));
             var session = query.Execute();
             hasSession = true;
         }
         catch (Exception)
         { }
     }
     // If we're not authenticated, we have to authenticate now using Forms
     if (!hasSession && redirection.FormsUri != null)
     {
         var authDomain = new AuthenticationDomain() { Uri = redirection.SessionUri.ToString() };
         authDomain = this.AuthenticateForms(authDomain,
             new Uri(string.Format("{0}?root={1}&redirect_url={2}", redirection.FormsUri, redirection.Root, Uri.EscapeUriString(Resources.RedirectURL))),
             redirection.TokenUri,
             redirection.Root);
         if (authDomain.OAuthToken == null)
         {
             return new EventHandlerResponse() { Action = EventHandlerResponseAction.Throw };
         }
     }
     return new EventHandlerResponse() { Action = EventHandlerResponseAction.Redirect, Redirection = redirection };
 }
Exemplo n.º 27
0
 public void Load()
 {
     using (var reader = new StreamReader(new FileStream(Path, FileMode.Open)))
     {
         AuthenticationDomain domain = null;
         while (!reader.EndOfStream)
         {
             var line = reader.ReadLine();
             if (line != null)
             {
                 line = line.Trim();
                 if (line.StartsWith("["))
                 {
                     if (domain != null)
                     {
                         Domains.Add(domain.Id, domain);
                     }
                     domain    = new AuthenticationDomain();
                     domain.Id = line.Substring(1, line.IndexOf(']') - 1);
                 }
                 else if (line.StartsWith("Provider"))
                 {
                     domain.Provider = line.Split('=')[1].Trim();
                 }
                 else if (line.StartsWith("IsDefault"))
                 {
                     domain.IsDefault = bool.Parse(line.Split('=')[1].Trim());
                 }
                 else if (line.StartsWith("Uri"))
                 {
                     domain.Uri = line.Split('=')[1].Trim();
                 }
                 else if (line.StartsWith("AccessToken"))
                 {
                     domain.OAuthToken = line.Split('=')[1].Trim();
                 }
                 else if (line.StartsWith("RefreshToken"))
                 {
                     domain.OAuthRefreshToken = line.Split('=')[1].Trim();
                 }
                 else if (line.StartsWith("Account"))
                 {
                     domain.Account = line.Split('=')[1].Trim();
                 }
                 else if (line.StartsWith("Domain"))
                 {
                     domain.Domain = line.Split('=')[1].Trim();
                 }
                 else if (line.StartsWith("ApiVersion"))
                 {
                     domain.ApiVersion = line.Split('=')[1].Trim();
                 }
             }
         }
         if (domain != null)
         {
             Domains.Add(domain.Id, domain);
         }
     }
     foreach (var id in Domains.Keys)
     {
         if (Domains[id].IsDefault)
         {
             Client = CreateClient(Domains[id]);
             break;
         }
     }
 }
 public void Load()
 {
     using (var reader = new StreamReader(new FileStream(Path, FileMode.Open)))
     {
         AuthenticationDomain domain = null;
         while (!reader.EndOfStream)
         {
             var line = reader.ReadLine();
             if (line != null)
             {
                 line = line.Trim();
                 if (line.StartsWith("["))
                 {
                     if (domain != null)
                     {
                         Domains.Add(domain.Id, domain);
                     }
                     domain = new AuthenticationDomain();
                     domain.Id = line.Substring(1, line.IndexOf(']') - 1);
                 }
                 else if (line.StartsWith("Provider")) domain.Provider = line.Split('=')[1].Trim();
                 else if (line.StartsWith("IsDefault")) domain.IsDefault = bool.Parse(line.Split('=')[1].Trim());
                 else if (line.StartsWith("Uri")) domain.Uri = line.Split('=')[1].Trim();
                 else if (line.StartsWith("AccessToken")) domain.OAuthToken = line.Split('=')[1].Trim();
                 else if (line.StartsWith("RefreshToken")) domain.OAuthRefreshToken = line.Split('=')[1].Trim();
                 else if (line.StartsWith("Account")) domain.Account = line.Split('=')[1].Trim();
                 else if (line.StartsWith("Domain")) domain.Domain = line.Split('=')[1].Trim();
                 else if (line.StartsWith("ApiVersion")) domain.ApiVersion = line.Split('=')[1].Trim();
             }
         }
         if (domain != null)
         {
             Domains.Add(domain.Id, domain);
         }
     }
     // Load the default auth domain
     foreach (var id in Domains.Keys)
     {
         if (Domains[id].IsDefault)
         {
             Client = CreateClient(Domains[id]);
             PrimaryDomain = Domains[id];
             if (!string.IsNullOrEmpty(Domains[id].OAuthToken))
             {
                 Client.AddOAuthCredentials(new Uri(Domains[id].Uri), Domains[id].OAuthToken);
             }
             break;
         }
     }
 }