Вход пользователя в приложение MVC с другого веб-сайта или через веб-службу

#asp.net #asp.net-mvc

#asp.net #asp.net-mvc

Вопрос:

Вот ситуация: пользователь может войти в приложение MVC с другого веб-сайта. Этот веб-сайт не основан на ASP.NET. Это может быть PHP, JSP или Websphere … или что угодно

Я пытался сделать это:

  [HttpPost]
 public string RemoteLogOn(string userName, string password)
 {

     if (userName != null amp;amp; password != null)
     {                  
          if (MembershipService.ValidateUser(userName, password))
          {
               FormsAuthentication.SetAuthCookie(userName, false);
               return "success";

          }
          else
          {
                return "failed";
          }                
      }
      else
      {
           return "failed";
      }    
}
  

Вызов приложения MVC по URI /RemoteLogOn (отправка запроса с использованием PHP и cURL) работает. Возвращается строка «success». Однако, похоже, что файл cookie сгенерирован неправильно — когда я вернулся на сайт MVC и проверил User. Identity.Name , возвращается значение null.

Как правильно разрешить пользователю входить в систему через. веб-служба?

Редактировать Как мне правильно установить возвращаемый файл cookie.

PS. Это всего лишь пробный POC; в конечном итоге мы будем использовать SOAP или REST и попытаемся улучшить безопасность.

Вот PHP-код, который выполнил вызов

 <?php
$url = "http://localhost:54134/Account/RemoteLogOn";
$fields = array(
            "userName" => "asd1234",
            "password" => "****"
        );

 foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'amp;'; }
rtrim($fields_string,'amp;');

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);

//execute post
$result = curl_exec($ch);

echo '<pre>'.print_r($result, true).'</pre>';

//close connection
curl_close($ch);
</php>
  

Отладка приложения показывает, что имя пользователя и пароль правильно переданы стороне MVC.

Комментарии:

1. Это хороший вопрос, но с очень плохой информацией. Как вы сейчас выполняете вызов? Вместо проверки User.Identity.Name вам нужно проверить файл cookie и посмотреть, есть ли он там. Используете ли вы затем cookie снова?

2. Вызов выполняется из PHP с использованием cURL. Добавлены подробности, если это уместно. В основном я проверяю, существует ли файл cookie через User. Идентификация. Нужно ли мне вручную проверять наличие файла cookie и затем обрабатывать его?

3. Затем вы возвращаете полученный файл cookie в ответ на PHP? В противном случае файл cookie теряется.

4. Нет, я не знаю, как это сделать; разбираюсь с этим самостоятельно. Как мне это сделать?

Ответ №1:

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

Вот как установить, где хранить файлы cookie (и включать в последующие запросы) в PHP:

 curl_setopt($ch, CURLOPT_COOKIEJAR, 'mycookiefile');
  

Вам нужно, чтобы имя файла cookie было постоянным в процессе, поэтому я бы предложил использовать переменную и инициализировать ее таким образом:

 $cookieFile = tempnam("/tmp", "CURLCOOKIE");
  

Вы можете получить более подробную информацию об этом на сайте документации PHP:

http://www.php.net/manual/en/function.curl-setopt.php

Ответ №2:

Тогда это становится вопросом curl и PHP. Я не знаю curl и немного знаю PHP, но это должно быть легко:

  • Возьмите файл cookie авторизации, проверив значение Set-Cookie заголовка
  • проанализируйте значение в формате .ASPXAUTH=<Cookie Value> и получите значение cookie
  • Установите cookie в PHP
  • Во всех последующих вызовах получайте значение cookie от клиента и отправляйте на сервер с помощью curl

Комментарии:

1. Если пользователь перейдет на веб-сайт MVC, будет ли сохранен файл cookie?

2. Для PHP-сайта не установлен cookie, поэтому браузер будет продолжать отправлять его. Сайт PHP не может установить cookie для сайта MVC, поскольку это противоречит политике конфиденциальности.

3. Подумайте о том, где хранятся cookie-файлы — переход с PHP на MVC является независимым сеансом. Если пользователь посещает сайт MVC в своем браузере, это будет другой сеанс. Помните, что cookie в PHP-сообщении хранится в некотором временном каталоге, не имеющем ничего общего с браузером пользователя.

4. Есть ли какой-либо способ выполнить вход на стороне PHP, при этом пользователь остается авторизованным на стороне MVC?

5. Как я уже сказал, незаконно устанавливать cookie для другого веб-сайта. Я не знаю способа, которым вы могли бы заставить это работать с одним входом, который работает для обоих сайтов.

Ответ №3:

 curl_setopt($ch, CURLOPT_COOKIEJAR, '/some/path/cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, '/some/path/cookies.txt');
  

Это должно сработать. Поскольку вам необходимо сохранить файлы cookie и отправить их обратно. В противном случае каждый запрос обрабатывался бы так, как если бы он исходил от совершенно другого пользователя.