Использование Аутентификации пользователя/Передачи RESTful WCF & Windows Forms

Предупреждение: [fункция] ожидает, что параметр 1 будет ресурсом, boolean задан

(более общий вариант Предупреждение: mysql_fetch_array () ожидает, что параметр 1 будет resource, boolean given )

Ресурсы - это тип в PHP (например, строки, целые числа или объекты). Ресурс является непрозрачным блобом без собственной значимой ценности. Ресурс специфичен и определен определенным набором функций или расширений PHP. Например, расширение Mysql определяет два типа ресурсов :

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

Расширение cURL определяет другой два типа ресурсов :

... дескриптор cURL и мультирум cURL.

Когда var_dump ed значения выглядят так:

$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)

Это все большинство ресурсов - это числовой идентификатор ((1)) определенного типа ((curl)).

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


«... ожидает, что параметр 1 будет ресурсом, логическим данная "ошибка, как правило, является результатом непроверенной операции, которая должна была создать ресурс, но вместо этого вернула false. Например, функция fopen имеет это описание:

Возвращаемые значения

Возвращает ресурс указателя файла при успешном выполнении или FALSE

Таким образом, в этом коде $fp будет либо resource(x) of type (stream), либо false:

$fp = fopen(...);

Если вы не операция fopen будет успешной или неудачной и, следовательно, будет ли $fp действительным ресурсом или false и передать $fp другой функции, которая ожидает ресурс, вы можете получить вышеуказанную ошибку:

$fp   = fopen(...);
$data = fread($fp, 1024);

Warning: fread() expects parameter 1 to be resource, boolean given

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

$fp = fopen(...);

if (!$fp) {
    trigger_error('Failed to allocate resource');
    exit;
}

$data = fread($fp, 1024);

Связанные ошибки:

36
задан Community 23 May 2017 в 12:30
поделиться

4 ответа

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

, Какую реализацию защиты я должен использовать?

и

я должен даже действительно быть обеспокоен чем-нибудь кроме простого текста, если я использую SSL?

Стандартная аутентификация по SSL прекрасна - в конце концов, это, как много существующих веб-сайтов аутентифицирует пользователей. (Когда Вы входите в свой Amazon, делая покупки учетная запись, они просто передают Ваше имя пользователя и пароль, когда Вы ввели его по соединению SSL.) Я понимаю то, что статья говорит о безопасности, и атаки с подбором по словарю, но и тому подобное, сохраняют его простым и получают что-то работающее сначала. Простой API UPS XML просит имя пользователя и пароль с каждым вызовом, также - API POX FedEx, также - API SOAP PayPal и API SOAP CyberSource - это, кажется, достаточно прекрасно для использования реального мира.

там какой-либо способ постараться не отправлять имя пользователя/пароль с каждым вызовом WCF? Я предпочел бы не отправлять эти дополнительные байты, если соединение было установлено вначале, которым это будет, прежде чем последующим вызовам позволяют быть выполненными после входа в систему.

Это - то, на которое я могу ответить немного более уверенно. Обычно, мы пытаемся разработать наши стоящие с общественностью сервисы WCF быть не сохраняющими состояние. Тем путем наши сервисы WCF масштабируются легко; просто бросьте больше аппаратных средств и больше серверов и подсистем балансировки нагрузки в проблеме, и мы не должны волноваться о липких сессиях или поддерживающий состояние сеанса где-нибудь. Таким образом, это означает, что, если мы хотим "сохранить пользователя, вошел в систему", тогда это не что-то, что это собирается произойти на сервере.

то, Что я закончил тем, что делал, рассматривает мой веб-сайт как доверяемую подсистему. Это аутентифицировало против сервиса WCF с помощью предобщего сертификата X509, и если бы клиент был зарегистрирован в веб-сайт через Аутентификацию Форм, то это отправило бы потребительский заголовок имени пользователя службе; пользовательское поведение конечной точки на сервисе WCF искало бы этот заголовок, видеть, что это было установлено доверяемой подсистемой, и продолжите исполнять роль того пользователя без пароля пользователя, бывшего должного быть предоставленным или проверенным против базы данных.

, Так как Вы используете REST, Вы могли, вероятно, использовать cookie на стороне клиента для поддержания состояния. Если Вы используете Режим эмуляции ASP.NET, я думаю, что можно даже использовать Аутентификацию Форм непосредственно, но я не знаю много об этом подходе, так как моим сервисом WCF не был размещенный IIS.

Короче говоря, хотя, Вы оказываетесь перед необходимостью отправлять что-то с каждым запросом для идентификации пользователя, является ли это именем пользователя и паролем, просто имя пользователя или некоторое хешированное значение, сохраненное в cookie. Если бы последняя опция, я предполагаю, что у Вас должен был бы быть своего рода Login() метод или что-то на сервисе, что-то, что отправит "хорошо, Вы зарегистрированы, если Вы передаете в этом значении хэш-функции с будущими запросами". Но не все клиенты REST будет ожидать получать cookie, просто простой ПОЛУЧАТЬ/помещ¦тъ/POST/УДАЛЯТЬ запросы без любого состояния.

, Если бы те были моей обувью, я или пошел бы для доверяемого подхода подсистемы (где заголовок имени пользователя предоставляется наряду с предобщими учетными данными для подсистемы), или я потребовал бы аутентификации на каждом вызове. Сервис, вероятно, получил бы некоторый высокоэффективный механизм кэширования аутентификации, если бы все те повторные запросы стали проблемой.

Hope, которая помогает немногому.

17
ответ дан Community 27 November 2019 в 06:16
поделиться

Спасибо за ответы. При отстранении и взгляде ясно и несмещенный в проблеме в целом (другими словами, игнорирующий 4 + часы я инвестировал изучение УСПОКОИТЕЛЬНЫХ сервисов) я пытаюсь получить вещь, работающую без REST на данный момент и ссылок, за которыми я пытаюсь следовать, в данный момент они: -

Это кажется применимым для того, что я хочу.

lextm: я слышу Вас на этом, после того, как я записал сообщение, которое я просканировал ближе через руководство по обеспечению безопасности WCF и сделал примечания по всем своим требованиям на основе опций, учитывая, они хотят, чтобы Вы думали о на каждом принципе.

я выбрал:
- Режим безопасности Передачи: Транспортная безопасность
- Подлинная Опция: Основная безопасность
- Привязка: wsHttpBinding
- Пользовательская аутентификация с блоком проверки допустимости имени пользователя

световой сигнал In примеров предусмотрел каждого, и рассмотрение варианта использования окон формирует w/WCF сервис, это походит на лучший способ пойти.

Nicholas: Согласованный, разрабатывая сервисы быть не сохраняющим состояние, вероятно, лучший подход.

Так на основе статьи я буду следовать, когда я получу время, она использует сертификат X509, который я очень плохо знаком для (поймите использование этого Nicholas), это будет прекрасно, учитывая это клиентское приложение, может быть загружен с Интернета и установлен на чьем-либо ПК, у кого есть учетная запись с моим веб-сайтом?

Аплодисменты для всей Вашей справки, Graham

пз: я думаю это, самый близкий вариант использования к моему сценарию (кроме, я хочу использовать транспортную безопасность), я должен рассматривать реализацию этого, поскольку это не беспокоится сертификатом? От кавычки я читал, мне, возможно, понадобился бы сертификат, поскольку "Шифрование сертификата X509 требуется WCF, потому что удостоверения клиента (имя пользователя/пароль) передаются как открытый текст в сообщении SOAP". - однако от того, что я изучил и что мы сказали, если я использую SSL, эта точка, вероятно, спорна?

3
ответ дан GONeale 27 November 2019 в 06:16
поделиться

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

Между прочим, Вы тщательно читали эти страницы?

Понятие http://www.codeplex.com/WCFSecurityGuide/Wiki/View.aspx?title=Ch%2005%20-%20Authentication,%20Authorization%20and%20Identities%20in%20WCF&referringTitle=Home

и Как к http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20Tos&referringTitle=Home

1
ответ дан Lex Li 27 November 2019 в 06:16
поделиться

Использование обычной аутентификации:

WebHttpBinding binding = new WebHttpBinding();
binding.SendTimeout = TimeSpan.FromSeconds(25);
binding.Security.Mode = WebHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

Uri address = new Uri("http://localhost:3525/WcfRestWeb/Quotes.svc");

WebChannelFactory<IQuoteService> factory =
             new WebChannelFactory<IQuoteService>(binding, address);

factory.Credentials.UserName.UserName = "tan";
factory.Credentials.UserName.Password = "wani";

IQuoteService proxy = factory.CreateChannel();

var response = proxy.GenerateQuote(GetQuoteRequest());
Console.WriteLine("Quote Amount: " + response.QuoteAmount);
7
ответ дан 27 November 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: