Как аутентифицировать пользователя при вызове службы WCF с помощью AJAX?

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


person lourdhu    schedule 18.08.2010    source источник
comment
Вы пытаетесь аутентифицировать пользователя из своего JavaScript? Так что, если пользователь не аутентифицирован, вызов службы даже не будет выполнен? Извините, если я повторяю ваш вопрос, но я хотел убедиться, что понимаю ваше требование. Спасибо!   -  person David Hoerster    schedule 19.08.2010
comment
Службы wcf ajax не имеют каких-либо функций безопасности, таких как проверка подлинности Windows, проверка подлинности имени пользователя / пароля, сертификаты x509 и т. д. мы должны защищать данные на транспортном уровне с помощью SSL, но я хочу защитить свой вызов wcf ajax безопасным способом, я имею в виду, что я не 'хочу разрешить хакерам, спуфингу или темперированию моих веб-методов с помощью javascript. я понятия не имею, как это сделать.   -  person lourdhu    schedule 22.08.2010
comment
Добавил ответ / предложение ниже. Не уверен, что это то, что вы ищете, но дайте мне знать, и я смогу внести соответствующие изменения.   -  person David Hoerster    schedule 23.08.2010


Ответы (3)


Есть несколько способов защитить свои службы 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 о режиме совместимости с 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

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

person David Hoerster    schedule 23.08.2010
comment
вы упомянули хороший момент об aspNetCompatibility, но моя служба wcf - это отдельный проект, а не в приложении веб-сайта asp.net. Я не использую проверку подлинности с помощью форм. Я проверяю пользователя на уровне базы данных. но есть сеанс для передачи учетных данных. доступ на уровне ролей и страниц также в базе данных. - person lourdhu; 25.08.2010
comment
Вам не обязательно иметь службу в проекте веб-сайта. Я использую совместимость с asp.net для нескольких служб в проекте, и мои службы находятся в отдельной DLL, на которую ссылается веб-проект. - person David Hoerster; 25.08.2010
comment
Дэвид, наличие режима совместимости - хорошая идея и обеспечение доступа к HttpContext, как вы упомянули, однако это не мешает вам вызывать службу, когда вы не аутентифицированы. - person Ehsan; 20.06.2014

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

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

Веб-сервис asmx взял на себя ответственность за безопасность.

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

So:

ASPX -> ASMX WebService -> WCF

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

person MattC    schedule 27.08.2010

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

person lourdhu    schedule 25.08.2010