2010-08-18 1 views
4

У меня есть служба WCF, которую нужно вызывать с клиентской стороны (ajax-вызов). Я хочу использовать ScriptManager на странице ASPX, чтобы добавить ServiceReference в службу WCF (или) JQuery ajax для вызова службы WCF. Я хочу запретить анонимным пользователям доступ к службе WCF. Есть ли способ сделать аутентификацию пользователя перед вызовом метода службы из JavaScript? как защитить мои вызовы службы WCF с клиентской стороны?Как аутентифицировать пользователя при вызове службы WCF с помощью AJAX?

+0

Вы пытаетесь аутентифицировать пользователя из своего JavaScript? Итак, если пользователь не прошел аутентификацию, то вызов службы даже не будет сделан? Извините, если я повторяю ваш вопрос, но я хотел убедиться, что я понимаю ваше требование. Благодаря! –

+0

wcf службы ajax не имеют каких-либо функций безопасности, таких как проверка подлинности Windows, аутентификация имени пользователя и пароля, сертификаты x509 и т. Д., Мы должны защищать данные на уровне транспорта с помощью SSL, но я хочу защитить мой wcf-вызов ajax в защищенном режиме. не хотите, чтобы хакеры или спуфинг или tempring мои веб-методы с помощью javascript. Я не знаю, как это сделать. – lourdhu

+0

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

ответ

5

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

По умолчанию эта функция отключена, но вы можете включить его с помощью дополнения к вашему web.config:

<system.serviceModel> 
     ... 
     <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
     ... 
</system.serviceModel> 

Это позволит включить режим совместимости для всех служб в вашем приложении. Вы также можете включить это на услугу по сервисной базе, установив значение web.config, а также с помощью атрибута AspNetCompatibilityRequirements от класса обслуживания не интерфейс):

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 
public class FooService: IFooService { 
} 

При включении этого параметра, вы имеете доступ к HttpContext.Current (например, страница ASP.NET), а также будет гарантировать, что пользователь должен пройти аутентификацию перед доступом к файлу .svc (так же, как вы должны пройти аутентификацию перед доступом к любому .aspx-файлу). Если вы попытаетесь получить доступ к файлу .svc без проверки подлинности и используете проверку подлинности форм, вызывающий будет перенаправлен на страницу входа по умолчанию и после успешной проверки подлинности будет перенаправлен в файл .svc.

Это предложение делает несколько предположений:

  • ваши услуги в приложении ASP.NET;
  • вы используете некоторую аутентификацию ASP.NET (например, проверку подлинности форм) для проверки учетных данных пользователей и сохранения билета проверки в файле cookie;

Данное предложение, возможно, не самое безопасное или надежное, возможно, является самым простым, по крайней мере, для запуска и запуска вашего сайта в разумной степени.

Хороший MSDN library intro article в режиме совместимости ASP.NET.

Если это сработает, возможно, следующим шагом будет изучение чего-то типа аутентификации HMAC (что требует немного большей работы и координации секретных ключей, но это определенно более безопасно ИМХО). Вот хороший прогон его реализации - http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/22/how-to-implement-hmac-authentication-on-a-restful-wcf-service.aspx

Надеюсь, это поможет. Удачи!!

+0

Вы упомянули хороший момент о aspNetCompatibility, но мой wcf-сервис - проект separte не в веб-приложении asp.net. Я не использую проверку подлинности форм. Я проверяю пользователя на уровне базы данных. но с сеансом для передачи учетных данных. роль и доступ на уровне страницы также в базе данных. – lourdhu

+0

Вам не нужно иметь сервис в проекте веб-сайта. Я использую совместимость asp.net на нескольких сервисах в проекте, а мои службы находятся в отдельной DLL, на которую ссылается веб-проект. –

+0

David, наличие режима совместимости является хорошей идеей и предоставляет доступ к HttpContext, как вы упомянули, однако это не мешает вам звонить службе, когда вы не аутентифицированы. – Ehsan

0

для веб-сервиса WCF. Единственный способ защитить конечную точку Web - это разоблачить ее через HTTPS, используя транспортную безопасность. При использовании безопасности на основе сообщений информация о безопасности обычно помещается в заголовки SOAP, и поскольку сообщения, отправленные на конечные точки без SOAP, не содержат SOAP-конверта, нет никакой информации о безопасности, и вы должны полагаться на безопасность транспорта.

2

Я не уверен, что это поможет, но я разместил слой между WCF и Webapp.Я бы сделал вызов службы поддержки AJAX локальному asmx. Это было под защитой билета проверки подлинности форм. После этого asmx выполнит дальнейшие проверки безопасности (если этому конкретному пользователю, выполняющему вызов, было позволено запрашивать данные или формировать данные на основе пользователя), а затем переадресовать вызов на мою службу WCF.

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

asmx webservice несет ответственность за безопасность.

Затем я создал WCF в IIS с использованием WAS и разрешил доступ к Windows Auth для идентификации, с которым работает пул приложений Webapp.

Итак:

ASPX -> ASMX WebService -> WCF

Я думаю, что даст вам контроль/разделения и безопасности вы просите?