2012-01-24 18 views
1

ユーザー名とパスワードを必要とするスタンドアロン認証WCF Webサービスの問題はありますか? httpsなどのベストプラクティスを使用する必要がありますか?スタンドアロン認証wcf Webサービス

また、WCF Webサービスでユーザーのパスワードをリセットしたい場合は、どのようにしてあらゆる種類のブルートフォース攻撃を防止できますか?またはこのアプローチについてもベストプラクティスがありますか?私は電子メール/ユーザー名を送信してパスワードをリセットします。

答えて

1

あなたのサービスの認証をexternaliseしたい場合、これは、試験のために、賢明なアプローチでありますWindows Azure Access Control Serviceを使用して、Active DirectoryフェデレーションサービスやFacebookやGoogleなどの別のアイデンティティプロバイダとのIDフェデレーションをサポートできます。

この利点は、X.509証明書などの将来の代替認証方式をサポートすることが比較的容易であることです。

必要に応じて複雑に見えるかもしれませんが、WS-Trustなどの標準プロトコルを使用して認証サービスを実装することを検討する必要があります。この場合のサービスは、専門用語を使用するセキュリティトークンサービス(STS)になります。これはWindows Identity Foundation(WIF)を使用してサポートされており、Visual Studio用のWIFツールにはサンプルSTSが付属しています。

Dominic Baierによって作成された優れた既製のオープンソースSTSがあります。必要に応じてダウンロードしてカスタマイズできます(独自のユーザー名/パスワードストアを使用するなど)。あなたは、私が言うように、これはおそらくあなたが必要以上に複雑であり、ここで

http://identityserver.codeplex.com/

これをダウンロードすることができますが、将来的には本当に良い投資である可能性があります。

+0

これは実際にはかなり面白そうです。 –

+0

私は最近、自分の認証サービスを利用して噛まれてしまいました。そして、それをより複雑にするために何度か反復した後、私たちは適切なSTSにリファクタリングします。 –

2

はい、httpsを使用してください。 httpを介した認証は、認証されていないサービスと同様に攻撃される傾向があるため、誰もがワイヤを通過するプレーンテキストを盗聴することができます。あなたはその電子メールなどを送信することにより変更することができ、ユーザ名、パスワードを持っている..あなたは、サーバー上のいくつかのテキストファイルを作成することができUserNamePasswordValidatorクラスを使用して、認証を実装することができますWCFでの良い方法は...あり

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

関連する問題