Exemplo n.º 1
0
        public async Task<IAuthenticatedCrest> Authenticate(string clientId,
                                                            string clientSecret,
                                                            Uri listenUri,
                                                            AuthenticatedCrestScope scope)
        {
            var result = new AuthenticatedCrest
                         {
                             ClientId = clientId,
                             ClientSecret = clientSecret
                         };
            var state = Guid.NewGuid();
            try
            {
                return await Task.Factory.StartNew(
                                                   () =>
                                                   {
                                                       _authenticatedCrests[state] = result;

                                                       WEBSERVER.ListenFor(listenUri);

                                                       var scopeString = GetScopeString(scope);
                                                       Process.Start(
                                                                     $"{Settings.SsoUrl}oauth/authorize?response_type=code&redirect_uri={HttpUtility.UrlEncode(listenUri.ToString())}&client_id={clientId}&state={state}&scope={scopeString}");

                                                       var start = DateTime.UtcNow;
                                                       while (result.State == AuthenticatedCrestState.WaitingForAuthentication
                                                              && (DateTime.UtcNow - start) < Settings.AuthenticationTimeout)
                                                       {
                                                           lock (_monitor)
                                                           {
                                                               Monitor.Wait(_monitor, Settings.AuthenticationTimeout);
                                                           }
                                                       }

                                                       //check for timeout
                                                       if (result.State == AuthenticatedCrestState.WaitingForAuthentication)
                                                       {
                                                           result.State = AuthenticatedCrestState.AuthenticationFailed;
                                                       }

                                                       return result;
                                                   },
                                                   TaskCreationOptions.LongRunning)
                                 .ConfigureAwait(false);
            }
            catch (Exception e)
            {
                Log.Logger.Error(e, $"Could not authenticate/authorize {clientId}");

                result.State = AuthenticatedCrestState.AuthenticationFailed;
            }
            finally
            {
                _authenticatedCrests.Remove(state);
            }

            return result;
        }
Exemplo n.º 2
0
 private static string GetScopeString(AuthenticatedCrestScope scope)
 {
     var strings = new List<string>();
     if (scope.HasFlag(AuthenticatedCrestScope.CharacterFittingsRead))
     {
         strings.Add("characterFittingsRead");
     }
     if (scope.HasFlag(AuthenticatedCrestScope.CharacterFittingsWrite))
     {
         strings.Add("characterFittingsWrite");
     }
     if (scope.HasFlag(AuthenticatedCrestScope.CharacterContactsRead))
     {
         strings.Add("characterContactsRead");
     }
     if (scope.HasFlag(AuthenticatedCrestScope.CharacterContactsWrite))
     {
         strings.Add("characterContactsWrite");
     }
     if (scope.HasFlag(AuthenticatedCrestScope.CharacterLocationRead))
     {
         strings.Add("characterLocationRead");
     }
     if (scope.HasFlag(AuthenticatedCrestScope.CharacterNavigationWrite))
     {
         strings.Add("characterNavigationWrite");
     }
     return string.Join("%20", strings);
 }