Webservice, доступ. Как правильно делать?

Дмитрий_N
Дата: 09.04.2010 09:01:37
Добрый день!

Подскажите, как правильно сделать..
Есть Web Site с настроеной аутентификацией Forms. Нужно создать webservice. Его будет опрашивать другое приложение (передавать параметры и получать ответ). Сам webservice я сделал.. Нужно чтобы получить данные с него могли только логины, прошедшие аутентификацию и авторизацию.. Но дальше одни вопросы.. Доступ к этому webservice имеют все кто знает его адрес? Можно ли ограничить права доступа к webservice? (webconfig, связать с уже настроеной аутентификацией на сайте или как-нибудь еще?)

И если не сложно, расскажите для понимания.. ввожу адрес веб службы в браузер, получаю доступ в тестовом режиме к методам webservicе.. при нажатии invoke получаю нужный результат.. а как из другого приложения вызвать webservicе и передать параметры? (в строку?) И как ответ получит это приложение (XML?)

Извините, если сумбурно написано, раньше не сталкивался.. Заранее спасибо!
prustr
Дата: 09.04.2010 14:26:36
Утилита WSDL создает прокси класс .NET, который можно использовать для обращения к сервису из других приложений...
например так:
"D:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\WSDL" http://<домен>/service.asmx?WSDL

результат будет помещен в текущий каталог.

Про авторизацию не знаю. В книге помню предлагалось чуть ли не через строку запроса... не разбирался
Дмитрий_N
Дата: 09.04.2010 14:51:27
Спасибо большое, потестирую отпишусь..
Тут еще немного статей интересных нашел, правда пока не очень понятно, как все это практически реализовать..

1. Проектирование веб сервисов
http://stump-workshop.blogspot.com/2006/12/web.html
2. Declarative and Imperative Security в .Net web сервисах
http://stump-workshop.blogspot.com/2007/01/declarative-and-imperative-security-net.html
3. Основы создания веб сервисов
http://www.realcoding.net/article/view/2519
4. Тема тут
http://www.sql.ru/forum/actualthread.aspx?tid=518545

Пока пытаюсь разобраться.. То, что написано в 4-ом пункте, кажется мне подходит, SSL уже настроен, специальный пользователь создан, вот только аутентификация Forms, а не windows integrated..
Дмитрий_N
Дата: 09.04.2010 15:20:27
prustr
Утилита WSDL создает прокси класс .NET, который можно использовать для обращения к сервису из других приложений...
например так:
"D:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\WSDL" http://<домен>/service.asmx?WSDL
результат будет помещен в текущий каталог.


Да, спасибо, прокси класс создается.. теперь бы научится его использовать)
n-string
Дата: 09.04.2010 16:43:53
Дмитрий_N
...вот только аутентификация Forms, а не windows integrated..
Vot teper peredavai login i parol v parametrah. Drugogo sposoba ne naidesh, tut mnogie bilis.
Куропаточка
Дата: 09.04.2010 17:13:34
Посмотрите в сторону WCF, там политики безопасности реально гибкие, можно и Forms прикрутить.
Дмитрий_N
Дата: 12.04.2010 13:33:17
n-string
Дмитрий_N
...вот только аутентификация Forms, а не windows integrated..
Vot teper peredavai login i parol v parametrah. Drugogo sposoba ne naidesh, tut mnogie bilis.

То есть передавать Login и пароль в открытом виде вместе с данными? или я не правильно понял?

Куропаточка
Посмотрите в сторону WCF

спасибо, почитаю про это..
Дмитрий_N
Дата: 14.04.2010 15:07:28
Дмитрий_N

а как из другого приложения вызвать webservicе и передать параметры? (в строку?)

Немного разобрался, может для кого будет полезна эта информация.
Для начала в web.config в раздел <system.web> надо добавить:
<webServices>
	<protocols>
		<add name="HttpSoap"/>
		<add name="HttpPost"/>
		<add name="HttpGet"/>
	</protocols>
</webServices>
Допустим webservice имеет имя mywebservice.asmx и находится в папке webservices. Он имеет вебметод mywebmethod с двумя входящими параметрами.
Тогда вызов webservice из адресной строки будет выглядеть, например, так:

http://mysite.ru/webservices/mywebservice.asmx/mywebmethod?param1=2182& param2=126
Перед param2 нужно убрать пробел..
Дмитрий_N
Дата: 16.04.2010 09:27:14
Появилась одна мысль, хотя допускаю, что она не нова, и возможно, изобретаю велосипед.. Но все же..

В стандартной таблице aspnet_membership есть поля Password, содержащий хэш (пароля + "подсоленный хэш") и поле PasswordSalt, содержащее "подсоленный хэш"(закодированное случайное число байт). Также есть таблица aspnet_Users в которой содержатся Логины и они связаны с таблицей aspnet_membership через UserId.
Теперь сама идея. Стороннее приложение сначало передает вебсервису только логин. Ищем, существует ли такой логин в системе и если да, отправляем назад PasswordSalt. После на клиенте получаем хэш пароля и PasswordSalt и отправляем результат вебсервису с параметрами запроса. Сравниваем с хранимым значение хэша и если совпадает, то возвращаем данные клинту.

Прокомментируйте такой подход, будет ли работать? Может есть какие подводные камни?
Igor Barchenko
Дата: 16.04.2010 11:23:17
Да что в лоб, что полбу Все едино. Если перехватить вызов, то что пароль передать в чистом виде что хеш. Все равно будет равенство - ага - он родимый...
Без SSL канала на вызовы критически важных и пользовательско зависимых данных все равно криво получается.