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 Membership Provider。

服务凭证必须放在您的服务行为中。

另外,不要忘记将行为链接到服务定义。

<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.aspxhttp://msdn.microsoft.com/en-us/图书馆/aa354513.aspx

是的,事实上,如果您以正确的方式配置它,它将在授予客户端运行服务方法的权限之前对客户端(用户、客户端服务)进行身份验证。

于 2013-03-15T11:17:16.527 回答