Передача данных из модели - PullRequest
       0

Передача данных из модели

0 голосов
/ 12 февраля 2020

В настоящее время я использую данные заполнения Salesforce API.

В контроллере учетной записи у меня есть метод, использующий поток имени пользователя / пароля Salesforce для авторизации использования API, и я прикрепил его для это при входе в систему, этот процесс в порядке, он работает, и я проверил его.

Но когда моя проблема вступает в игру, мне нужно получить доступ к значению AccessToken и значению ServiceUrl, сгенерированному при входе в систему, поэтому я Можно использовать мой, например, метод «GetEvents» в ДРУГОМ контроллере.

В настоящее время я использую модели, вообще без контекста данных, потому что он мне не нужен. Но если бы я должен был создать экземпляр этой модели в моем другом контроллере со свойством AccessToken, значение не было бы передано из метода контроллера, который сгенерировал этот токен.

Имейте в виду, что эти методы работают просто отлично, но мне нужно авторизоваться для просмотра ЛЮБОГО из этих событий, и если у него нет этих AccessToken и ServiceUrl из метода входа в систему, я не могу просмотреть какие-либо Мероприятия.

Как мне go узнать об этом?

МЕТОД В HomeController

        public async void GetAllEvents()
        {
            TokenModel tm = new TokenModel();

            HttpClient queryClient = new HttpClient();

            string restQuery = tm.ServiceUrl + "/services/data/v25.0/query?q=SELECT+Subject+from+Event";
            Console.WriteLine(restQuery);

            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, restQuery);
            Console.WriteLine(request);

            // Adding the token to the header 
            request.Headers.Add("Authorization", "Bearer " + tm.AccessToken);
            // Return JSON to the caller
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            //Call Endpoint Async
            HttpResponseMessage response = await queryClient.SendAsync(request);

            string result = await response.Content.ReadAsStringAsync();
            Console.WriteLine(result);
        }

МЕТОД В AccountController

        [HttpPost]
        [AllowAnonymous]
        public IActionResult Login(AuthRequestModel authRequest)
        {
            if (!ModelState.IsValid)
            {
                return View(authRequest);
            }

            if(authRequest == null)
            {
                return BadRequest("Authorization is missing");
            }

            var isAuth = Authentication.ActiveDirectoryValidation(authRequest.Username, authRequest.Password);
            if(isAuth == true)
            {
                AuthR().Wait();
                return RedirectToAction("Index", "Home");
            }

            return View();
        }

        // Salesforce Username / Password Validation
        public async Task<string> AuthR()
        {
            TokenModel tm = new TokenModel();
            var handler = new HttpClientHandler()
            {
                SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls
            };

            HttpClient authClient = new HttpClient(handler);

            string clientId = _config.GetSection("Keys").GetSection("client_id").Value;
            string clientSecret = _config.GetSection("Keys").GetSection("client_secret").Value;
            string username = _config.GetSection("Keys").GetSection("username").Value;
            string password = _config.GetSection("Keys").GetSection("password").Value;

            HttpContent content = new FormUrlEncodedContent(new Dictionary<string, string>
            {
                {"grant_type","password"},
                {"client_id",clientId},
                {"client_secret",clientSecret},
                {"username",username},
                {"password",password}
            }
          );

            HttpResponseMessage message = await
            authClient.PostAsync("https://test.salesforce.com/services/oauth2/token", content);

            string responseString = await message.Content.ReadAsStringAsync();
            var model = JsonConvert.DeserializeObject<Dictionary<string, string>>(responseString);

            tm.AccessToken = model["access_token"];
            tm.ServiceUrl = model["instance_url"];

            return tm.AccessToken;
        }

1 Ответ

0 голосов
/ 13 февраля 2020

Я не C# парень, но, вероятно, у вас должен быть отдельный класс для нового входа в систему или повторного использования существующего идентификатора сеанса. Может быть методом stati c, может быть одноэлементным шаблоном (какое бы слово ни подходило для него в C#); если статика ведет себя нормально, вызывается из другой модели (поток?). Совместное использование идентификатора сеанса в некоторой глобальной переменной, вероятно, тоже может работать нормально, но немного вонючее.

Может быть, вам нужно где-то хранить идентификатор сеанса (если у вас нет доступного кеша в памяти, тогда, возможно, файл? База данных ?), зашифровано или нет.

Проверенный в бою шаблон для входа в SF будет выглядеть примерно так

do we have cached session id?
    no -> call login()
        -> it worked? great, cache new session id somewhere
        -> didn't work (account deactivated, password expired, network problems) - you have bigger problems your program probably can't recover from nicely, notify user? There's way to reset password via API but it's bit "pro"
    yes -> try to use it
        -> worked? great
        -> error? check the details / HTTP error code and if it's for example session id expired - call new login & handle it like above

В зависимости от метода аутентификации вы получите информацию, когда идентификатор сеанса срок действия истекает (например, через 2 часа, но при каждом использовании API счетчик сбрасывается). Не рассчитывай на то, что 2 часа слишком много. SF администратор может прервать ваш сеанс в любое время (например, запретить хакерский доступ). Или существует ограничение количества сессий, которые могут быть открыты для тех же учетных данных, что-то вроде 5-го вызова login () делает недействительным самый старый идентификатор сессии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...