2012-01-24 3 views
1

Есть ли проблема с автономной аутентификацией веб-службы WCF, которая берет имя пользователя и пароль? Должен ли я использовать https или некоторые другие лучшие практики?Автономная аутентификация wcf веб-служба

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

ответ

1

Это разумный подход, если вы хотите экспортирование аутентификации ваших услуг, для экзамена чтобы поддерживать федерацию идентификации с другим поставщиком идентификации, таким как службы федерации Active Directory или даже Facebook или Google, используя службу контроля доступа Windows Azure.

Дополнительным преимуществом этого является то, что в будущем было бы относительно легко поддерживать альтернативные схемы аутентификации, такие как сертификаты X.509.

Это может показаться сложным для ваших нужд, но вы должны обязательно рассмотреть возможность внедрения службы аутентификации с использованием стандартного протокола, такого как WS-Trust. Ваш сервис в этом случае будет использовать службу маркеров безопасности (STS) для использования жаргона. Это довольно хорошо поддерживается с помощью Windows Identity Foundation (WIF), и на самом деле WIF-инструменты для визуальной студии включают образец STS для вас.

В качестве альтернативы, существует прекрасная готовая STS с открытым исходным кодом, созданная Dominic Baier, которую вы можете загрузить, настроить при необходимости (например, использовать свое собственное имя пользователя/хранилище паролей). Вы можете скачать этот здесь

http://identityserver.codeplex.com/

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

+0

Это действительно выглядит довольно интересно. –

+0

Я недавно был укушен, перевернув мою собственную службу аутентификации, а затем после нескольких итераций сделать ее все более сложной, мы заканчиваем рефакторинг в надлежащую STS - как мы должны были сделать в первую очередь; o) –

2

Да, вы должны использовать https. Поскольку аутентификация по http одинаково подвержена атаке как не прошедшей проверку подлинности службы, любой может обнюхивать простой текст, проходящий через провод. Существует хороший способ в WCF можно реализовать аутентификацию, используйте класс UserNamePasswordValidator .. Вы можете создать некоторый текстовый файл на сервере, имеют имя пользователя-пароль, который может быть изменен путем отправки по электронной почте и т.д ..

public class MyCustomValidator: System.IdentityModel.Selectors.UserNamePasswordValidator 
{ 
    public override void Validate(string userName, string password) 
    { 
     if (null == userName || null == password) 
     { 
      throw new ArgumentNullException(); 
     } 

     else 
     { 
      bool isValid = UserRepository.ValidateUser(userName,password); //any db based checking 

      if(!isValid) 
      { 
       throw new SecurityTokenException("Unknown Username or Password"); 
      } 
     } 
    } 
} 

конфигурации:

<system.serviceModel> 
     <bindings> 
     <wsHttpBinding> 
      <binding name="CustomAuthentication"> 
      <security mode="Message"> 
       <message clientCredentialType="UserName" /> 
      </security> 
      </binding> 
     </wsHttpBinding> 
     </bindings> 

     <behaviors> 
     <serviceBehaviors> 
      <behavior name="CustomValidator"> 
      <serviceCredentials> 
       <userNameAuthentication userNamePasswordValidationMode="Custom" 
       customUserNamePasswordValidatorType="MyAssembly.MyCustomValidator, MyAssembly"/> 
      </serviceCredentials> 
      </behavior> 
     </serviceBehaviors> 
     </behaviors>  

     <services> 
     <service name="MyService" behaviorConfiguration="CustomValidator"> 
      <endpoint address="" binding="wsHttpBinding" contract="IMyService" bindingConfiguration="CustomAuthentication" /> 
     </service> 
    </services> 
</system.serviceModel> 

, если вы хотите использовать аутентификацию без HTTPS, вы можете попробовать это: WCF Authentication using basicHttpBinding and custom UserNamePasswordValidator

Смежные вопросы