#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:
Ответ №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 и отправить их обратно. В противном случае каждый запрос обрабатывался бы так, как если бы он исходил от совершенно другого пользователя.