У меня есть служба WCF, которую нужно вызывать со стороны клиента (вызов ajax). Я хочу использовать ScriptManager на странице ASPX, чтобы добавить ServiceReference в службу WCF (или) вызов JQuery ajax для службы WCF. Я хочу запретить анонимным пользователям доступ к службе WCF. Есть ли способ выполнить аутентификацию пользователя перед вызовом метода службы из JavaScript? как защитить мои вызовы службы WCF со стороны клиента?
Как аутентифицировать пользователя при вызове службы WCF с помощью AJAX?
Ответы (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
Надеюсь, это поможет. Удачи!!
Не уверен, что это поможет, но я разместил слой между WCF и webapp. Я бы сделал вызов ссылки службы AJAX на локальный asmx. Это находилось под защитой билета проверки подлинности с помощью форм. Затем asmx будет выполнять любые дальнейшие проверки безопасности (если этому конкретному пользователю, выполняющему вызов, разрешено запрашивать эти данные или формировать данные на основе пользователя), а затем перенаправлять вызов в мою службу WCF.
Таким образом, моему уровню обслуживания не нужно было знать о пользователях каждого приложения, обращающегося к нему, а заботиться только о доставке запрошенных данных.
Веб-сервис asmx взял на себя ответственность за безопасность.
Затем я сделал WCF, размещенный в IIS, с помощью WAS и разрешил доступ Windows Auth только для удостоверения, с которым работал пул приложений webapp.
So:
ASPX -> ASMX WebService -> WCF
Я думаю, это даст вам контроль / разделение и безопасность, о которых вы просите?
для веб-службы HTTP WCF. Единственный способ защитить конечную веб-точку - открыть ее через HTTPS, используя транспортную безопасность. При использовании безопасности на основе сообщений информация о безопасности обычно помещается в заголовки SOAP, и поскольку сообщения, отправляемые на конечные точки, не относящиеся к SOAP, не содержат конверта SOAP, негде разместить информацию о безопасности, и вы должны полагаться на безопасность транспорта.