Каков наилучший подход к реализации авторизации / аутентификации для приложения Windows Forms, использующего службу RESTful WCF, размещенную на IIS?
Причина, по которой я спрашиваю, состоит в том, что я очень запутался, после того как просеял различные статьи и посты, в которых излагался другой метод, и, в конце концов, попал в документ на ~ 650 страниц по рекомендациям по безопасности WCF "(http://www.codeplex.com/WCFSecurityGuide) Я просто не уверен ЛУЧШИЙ подход и как начать реализацию, учитывая мой сценарий.
Я начал с этой статьи «Руководство по проектированию и созданию веб-сервисов RESTful с WCF 3.5» (http://msdn.microsoft.com/en-us/library/dd203052.aspx)) и видео с PDC о сервисах RESTful WCF, что было здорово и помогло мне реализовать мой первый REST-friendly WCF сервис,
После того, как служба работала, я вернулся для обеспечения безопасности, понимаете. «Соображения безопасности» (четверть страницы) и попытался реализовать HTTP-заголовок авторизации в соответствии с инструкциями, однако я обнаружил, что код неполон (посмотрите, как никогда не объявлялась переменная UserKeys). Именно в этот момент я попытался узнать больше о том, как это сделать (используя HMAC-хеш с заголовком HTTP «Авторизация», но не смог найти много в Google?), Он привел меня к другим статьям, касающимся безопасности на уровне сообщений, формы auth и пользовательские валидаторы, и, честно говоря, я не уверен, какой из них является наилучшим и наиболее подходящим подходом.
Итак, учитывая все сказанное (и спасибо, что выслушали до сих пор!), Я думаю, мои основные вопросы:
- Какую реализацию безопасности мне следует использовать?
- Есть ли способ избежать отправки имени пользователя / пароля при каждом вызове WCF? Я предпочел бы не посылать эти дополнительные байты, если соединение было установлено в начале, что будет до того, как последующие вызовы будут разрешены после входа в систему.
- Должен ли я вообще беспокоиться о чём-либо, кроме простого текста, если я использую SSL?
Как уже говорилось, .NET 3.5 приложение для создания форм, служба WCF, размещенная на IIS, однако важно, чтобы я желал, чтобы все службы WCF требовали эту процедуру авторизации (как бы это ни было, сеанс, заголовок http или другое) как Я не хочу, чтобы кто-нибудь мог использовать эти сервисы из Интернета.
Я знаю, что вышеупомянутый пост большой, но мне пришлось указать маршрут, по которому я уже спустился, и что мне нужно сделать, любая помощь очень ценится.
PS: мне также известно об этом посте Как настроить безопасные службы RESTful с WCF, используя имя пользователя / пароль + SSL , и если сообщество предложит мне отойти от REST для служб WCF, я могу сделать это Однако я начал с этого, чтобы сохранить согласованность для любых публичных API.
Я думаю, что важно указать, как я получаю доступ к своей службе WCF (контакт со службой работает, но каков наилучший способ проверки учетных данных - и затем возврата объекта Member?):
WebChannelFactory<IMemberService> cf = new WebChannelFactory<IMemberService>(
new Uri(Properties.Settings.Default.MemberServiceEndpoint));
IMemberService channel = cf.CreateChannel();
Member m = channel.GetMember("user", "pass");
Код, который был наполовину реализован из статьи MS (и мой собственный для тестирования):
public Member GetMember(string username, string password)
{
if (string.IsNullOrEmpty(username))
throw new WebProtocolException(HttpStatusCode.BadRequest, "Username must be provided.", null);
if (string.IsNullOrEmpty(password))
throw new WebProtocolException(HttpStatusCode.BadRequest, "Password must be provided.", null);
if (!AuthenticateMember(username))
{
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
return null;
}
return new Member() { Username = "goneale" };
}