Аутентификация пользователя / прохода с помощью RESTful WCF & Windows Forms
Каков наилучший подход к реализации авторизации / аутентификации для приложения Windows Forms, взаимодействующего с размещенной в IIS службой RESTful WCF?
Причина, по которой я спрашиваю, заключается в том, что я очень смущен, после того, как просеял различные статьи и Сообщения, выражающие другой метод, и в конечном итоге попал в документ ~650 страниц о лучших практиках безопасности WCF" (http://www.codeplex.com/WCFSecurityGuide ) я просто не уверен, какой подход лучше всего использовать и как начать работу. реализация, учитывая мой сценарий.
Я начал с этой статьи "руководство по проектированию и созданию веб-служб RESTful с помощью WCF 3.5" (http://msdn.microsoft.com/en-us/library/dd203052.aspx ) и видео PDC на RESTful WCF services, которое было отличным и помогло мне реализовать мой первый REST-дружественный сервис WCF,
После того, как служба заработала, я вернулся к реализации безопасности, см. "Соображения безопасности "(четверть страницы вниз) и попытался реализовать HTTP Заголовок авторизации в соответствии с инструкциями, однако я нашел код неполным (смотрите, как переменная 'UserKeys' никогда не объявлялась). Это тот момент, когда я попытался исследовать больше о том, как это сделать (используя хэш HMAC с заголовком HTTP" Authorization", но не смог найти много в google?) это привело меня к другим статьям, касающимся безопасности на уровне сообщений, auth форм и пользовательских валидаторов, и, честно говоря, я не уверен, какой из них является лучшим и наиболее подходящим подходом.
Итак после всего сказанного (и спасибо, что выслушали до сих пор!), Я думаю, что мои главные вопросы таковы:
- какую реализацию безопасности следует использовать?
- Есть ли способ избежать отправки имени пользователя / пароля при каждом вызове WCF? Я бы предпочел не отправлять эти дополнительные байты, если соединение было установлено в начале, что будет до того, как последующие вызовы будут разрешены после входа в систему.
- Мне даже очень озабочены всем кроме обычного текста, если я использую SSL?
Как уже было сказано, .NET 3.5 win forms app, IIS-размещенная служба WCF, однако важно то, что я хочу, чтобы все службы WCF требовали этой процедуры авторизации (однако она должна быть, session, http header или иным образом), поскольку я не хочу, чтобы кто-либо мог попасть в эти службы из интернета.
Я знаю, что вышеупомянутый пост большой, но я должен был выразить маршрут, который я уже прошел, и то, что мне нужно сделать, любая и вся помощь-это очень признателен.
PS: Я также знаю об этом посте Как настроить безопасные RESTful сервисы с WCF, используя username/password + SSL, и если сообщество предложит мне отойти от REST для служб WCF, я могу сделать это, однако я начал с этого, чтобы сохранить согласованность для любых публичных API.
Я думаю, что важно указать, как я получаю доступ к своей службе WCF (обращение к службе работает, но как лучше всего проверить учетные данные - и затем вернуться объект-член?):
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" };
}
4 ответа:
Ну, у меня нет никакого опыта с остальными возможностями WCF, но я много боролся с пониманием последствий выбора безопасности в моем вопросе безопасности WCF. Как вы уже заметили, существует реальная нехватка документации по WCF в интернете, и мой опыт отдыха ограничен, поэтому примите мои ответы с долей соли:
Какую реализацию безопасности следует использовать?
И
Должен ли я вообще беспокоиться о чем-либо, кроме обычный текст, если я использую SSL?
Обычная аутентификация по протоколу SSL-это нормально,в конце концов, так многие существующие веб-сайты аутентифицируют пользователей. (Когда вы входите в свой торговый аккаунт Amazon, они просто передают ваше имя пользователя и пароль, как вы его ввели через SSL-соединение.) Я понимаю, что говорится в статье о безопасности и атаках по словарям, но бла-бла-бла, держите его простым и сначала получите что-то работающее. Простой старый XML API UPS запрашивает имя пользователя и пароль с каждым вызовом, так же как и POX API FedEx, так же как SOAP API PayPal и SOAP API CyberSource-это, кажется, достаточно хорошо для использования в реальном мире.
Есть ли способ избежать отправки имени пользователя / пароля при каждом вызове WCF? Я бы предпочел не отправлять эти дополнительные байты, если соединение было установлено в начале, что будет до того, как последующие вызовы будут разрешены после входа в систему.
На этот вопрос я могу ответить несколько более уверенно. Как правило, мы стараемся разрабатывать наши общедоступных служб WCF, чтобы быть лицом без гражданства. Таким образом, наши службы WCF легко масштабируются; просто бросьте больше оборудования и больше серверов и балансировщиков нагрузки на проблему, и нам не нужно беспокоиться о липких сеансах или поддержании состояния сеанса где-то. Таким образом, это означает, что если мы хотим "держать пользователя в системе", то это не то, что произойдет на сервере. В итоге я стал рассматривать свой веб-сайт как доверенную подсистему. Он прошел проверку подлинности против службы WCF с использованием предварительно общий сертификат x509, и если клиент был зарегистрирован на веб-сайте с помощью форм проверка подлинности, тогда бы отправить клиента имя пользователя заголовок к службе; пользовательская конечная точка поведения на службу WCF хотел бы посмотреть на этот заголовок, то увидите, что он был установлен на доверенной подсистемы, и начать выдавать себя за этого пользователя без пароля пользователя нужно быть поставлено или проверяются по базе.Поскольку вы используете REST, вы, вероятно, могли бы используйте файл cookie на стороне клиента для поддержания состояния. Если вы используете ASP.NET режим совместимости, я думаю, что вы даже можете использовать проверку подлинности форм напрямую, но я мало что знаю об этом подходе, так как моя служба WCF не была размещена в IIS.
Короче говоря, вам придется отправлять что-то С каждым запросом, чтобы идентифицировать пользователя, будь то имя пользователя и пароль, просто имя пользователя или какое-то хэшированное значение, хранящееся в файле cookie. Если последний вариант, я думаю, вам придется есть какой-то методLogin()
или что-то в сервисе, что-то, что пошлет "хорошо, вы вошли, Если вы передадите это хэш-значение с будущими запросами."Но не все клиенты REST будут ожидать получать куки, просто простые запросы GET / PUT / POST / DELETE без какого-либо состояния.Если бы это были мои ботинки, я бы либо выбрал подход доверенной подсистемы (где заголовок имени пользователя поставляется вместе с предварительно разделенными учетными данными для подсистемы), либо я бы потребовал аутентификации на каждый вызов. Служба, вероятно, получит какой-то высокопроизводительный механизм кэширования аутентификации, если все эти повторяющиеся запросы станут проблемой.
Надеюсь, это немного поможет.
Использование обычной аутентификации:
WebHttpBinding binding = new WebHttpBinding(); binding.SendTimeout = TimeSpan.FromSeconds(25); binding.Security.Mode = WebHttpSecurityMode.TransportCredentialOnly; binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; Uri address = new Uri("http://localhost:3525/WcfRestWeb/Quotes.svc"); WebChannelFactory<IQuoteService> factory = new WebChannelFactory<IQuoteService>(binding, address); factory.Credentials.UserName.UserName = "tan"; factory.Credentials.UserName.Password = "wani"; IQuoteService proxy = factory.CreateChannel(); var response = proxy.GenerateQuote(GetQuoteRequest()); Console.WriteLine("Quote Amount: " + response.QuoteAmount);
Спасибо за ответы. Отступая назад и глядя ясно и непредвзято на проблему в целом (другими словами, игнорируя 4+ часа, которые я потратил, глядя на RESTful services) , я пытаюсь заставить вещь работать без отдыха на данный момент, и ссылки, которые я пытаюсь следовать в данный момент, таковы:: -
- http://blogs.msdn.com/pedram/archive/2007/10/05/wcf-authentication-custom-username-and-password-validator.aspx
- http://www.devatwork.nl/index.php/2007/05/31/wcf-username-authentication/
Это, кажется, применимо к тому, что я хочу.
Lextm: я слышу вас об этом, после того, как я написал сообщение, Я внимательно просмотрел руководство по безопасности WCF и сделал заметки обо всех моих требованиях, основанных на вариантах, которые они хотят, чтобы вы подумали примерно по каждому принципу.
Я выбрал:
- Режим Безопасности Передачи: Транспортная Безопасность
- Автор. Вариант: Базовая Безопасность
- Привязка: wsHttpBinding
- Пользовательская аутентификация с валидатором имени пользователяВ свете примеров, приведенных для каждого из них, и рассматривая случай использования службы windows forms w/ WCF, кажется, что это лучший путь.
Николас: согласен, проектирование служб без гражданства, вероятно, является лучшим подходом.
Итак основываясь на статье, за которой я буду следить, когда у меня появится время, он использует сертификат X509. что я очень новичок (понимаю, что вы используете это приложение) будет ли это нормально, учитывая, что это клиентское приложение может быть загружено из интернета и установлено на любом компьютере, который имеет учетную запись на моем веб-сайте?
Выпьем за вашу помощь!, Грэм
PS: я думаю, что это самый близкий вариант использования к моему сценарию (за исключением того, что я хочу использовать безопасность транспорта), если я рассматриваю возможность реализации это как же он не заморачивается с сертификатом? Судя по цитате, которую я прочел, мне может понадобиться сертификат. как " шифрование сертификата X509 требуется WCF, поскольку учетные данные клиента (имя пользователя/пароль) передаются в виде открытого текста в сообщении SOAP.- однако из того, что я узнал и что мы сказали, если я использую SSL, этот пункт, вероятно, спорный?
Ну, вы действительно не должны уделять так много внимания стороне WinForms, потому что сторона WCF-это ключ.
Кстати, вы внимательно читали эти страницы?И как это сделать http://www.codeplex.com/WCFSecurity/Wiki/View.aspx?title=How%20Tos&referringTitle=Home