2

私はWCFを学ぼうとしていますが、何をしなければならないのかよくわかりません。ユーザー名とパスワードを含むデータベースがあり、ユーザーはサービスを使用する前に認証する必要があります。

今のところ、ユーザー名とパスワードはハードコーディングされています。

class UsernameAuthentication : UserNamePasswordValidator
{
    /// <summary>
    /// When overridden in a derived class, validates the specified username and password.
    /// </summary>
    /// <param name="userName">The username to validate.</param><param name="password">The password to validate.</param>
    public override void Validate(string userName, string password)
    {
        var ok = (userName == "test") && (password == "test");
        if (ok == false)
            throw new AuthenticationException("username and password does not match");
    }
}

私のサービスはとてもシンプルです:

public class Service1 : IService1
{
    public int Add(int a, int b)
    {
        return a + b;
    }

    public int Subtract(int a, int b)
    {
        return a - b;
    }
}

私の質問は、これを機能させるためにweb.configファイルで正確に何を変更する必要があるかということです。私はいくつかのチュートリアルを見てきましたが、必要な変更を本当に理解していません。

また、私がやろうとしていること-ユーザーがサービスにアクセスする前にユーザーを認証しますが、これは正しい方法ですか?

ありがとう

編集:私の設定ファイル:

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="Binding1">
          <security mode="Message">
            <message clientCredentialType="UserName" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WcfService1.UsernameAuthentication, service1" />
          </serviceCredentials>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

エラー:service1.svcをアクティブ化できません。

4

1 に答える 1

4

web.configで、ユーザー名/パスワードのクレデンシャルを使用することと、カスタムパスワードバリデーターを使用することを指定する必要があります。

サービスのバインディングにより、セキュリティの種類(TransportまたはMessage、最適なもの)が設定されている必要があり、その種類のセキュリティには、使用する資格情報(ユーザー名とパスワード)を設定する必要があります。

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

ここ...で、はサービスに固有の他の多くの設定を意味します。

特定の種類のバインディングとセキュリティモードのみがこの種類の資格情報をサポートしていることを考慮してください。ただし、MSDNには必要なすべての情報があります。

クレデンシャルをユーザー名とパスワードに設定しない場合、この方法でユーザーを認証することはできません。

パスワードバリデーターを使用するようにサービスに指示するには、次のようなものを追加する必要があります。

<behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
            <serviceCredentials>
              <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Microsoft.ServiceModel.Samples.CalculatorService.CustomUserNameValidator, service" />
            </serviceCredentials>
         .....
         </serviceBehaviors>
</behaviors> 

Microsoft.ServiceModel.Samples.CalculatorServiceカスタムバリデーターを使用する名前空間はどこにあり、カスタムCustomUserNameValidatorバリデーター(UserNamePasswordValidatorこの場合)serviceは、サービスの名前です。

それ以外の場合、サービスはASP.NETメンバーシッププロバイダーなどのデフォルトのバリデーターを期待します。

サービスのクレデンシャルは、サービスの動作に含める必要があります。

また、動作をサービス定義にリンクすることを忘れないでください。

<services>
  <service behaviorConfiguration="ServiceBehavior" name="ServiceName">
    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="Binding1" contract="ContractName" />
     ....
  </service>
</services>

:web.configには、表示しなかった設定が他にもたくさんあります。要素の名前は方向性のみです。これは、ユーザー名のクレデンシャルを機能させるためだけのものです。

このような多くの優れたチュートリアルがあるため、MSDNを確認できます。http //msdn.microsoft.com/en-us/library/aa702565.aspx、http ://msdn.microsoft.com/en-us/ library/aa354513.aspx

はい、実際、これを正しい方法で構成すると、クライアント(ユーザー、クライアントサービス)を認証してから、サービスメソッドを実行する権限をクライアントに付与します。

于 2013-03-15T11:17:16.527 に答える