65.9K
CodeProject 正在变化。 阅读更多。
Home

生成基于 basicHttpBinding 的用户名身份验证(无需证书)

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.54/5 (7投票s)

2013年8月25日

CPOL

1分钟阅读

viewsIcon

60032

使用 basicHttpBinding 创建用于用户名身份验证的应用程序。

引言

一个向导,帮助您开发一个完整的 WCF 服务和客户端,基于 basicHttpBinding,无需证书。

背景

我接受了一项任务,需要调查使用用户名进行 WCF 身份验证。因此,我对 basicHttpBindingwsHttpBinding 进行了研究。在下面的文章中,我将向您展示如何使用 wsHttpBinding 进行带有身份验证的通信。

您可能已经知道如何构建一个 WCF 应用程序。因此,本文不是关于如何构建 WCF 应用程序,而是关于如何构建自定义用户名验证器以及如何构建配置文件。

使用代码

该应用程序有两个部分:服务部分和客户端部分。

在服务器部分,您可以构建一个名为 CustomUserNameValidator 的类,并继承 UserNamePasswordValidator。并实现抽象方法“Validate”。当用户名和密码无效时,您可以抛出异常。

自定义验证器代码

public class CustomUserNameValidator : UserNamePasswordValidator
{
    private const string USERNAME_ELEMENT_NAME = "userName";

    private const string PASSWORD_ELEMENT_NAME = "password";

    private const string FAULT_EXCEPTION_MESSAGE = "UserName or Password is incorrect!";

    public override void Validate(string userName, string password)
    {
        Guarder.Guard.ArgumentNotNull(userName)
            .ArgumentNotNull(password);
        var validateUserName = ConfigurationManager.AppSettings[USERNAME_ELEMENT_NAME];
        var validatePassword = ConfigurationManager.AppSettings[PASSWORD_ELEMENT_NAME];
        var validateCondition = 
            userName.Equals(validateUserName) && password.Equals(validatePassword);
        if (!validateCondition)
        {
            throw new FaultException(FAULT_EXCEPTION_MESSAGE);
        }
    }
}

以及服务配置,您应该注意到 serviceBehaviors 中的 serviceCredentials 元素以及绑定元素中的 security 元素

<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="customBehavior">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceCredentials>
            <userNameAuthentication 
              userNamePasswordValidationMode="Custom" 
              customUserNamePasswordValidatorType="EmployeesHost.CustomUserNameValidator, EmployeesHost"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings >
      <basicHttpBinding>
        <binding name="EmployeeQueryBinding_BasicHttp">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Basic"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service name="EmployeesHost.EmployeesQueryService" behaviorConfiguration="customBehavior">
        <!--For basic http binding endpoint-->
        <endpoint address="http://127.0.0.1:12215/EmployeeQuery" binding="basicHttpBinding" 
                  bindingConfiguration="EmployeeQueryBinding_BasicHttp"
                  contract="EmployeesHost.IEmployeesQueryService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://127.0.0.1:8733/Design_Time_Addresses/EmployeesHost/EmployeesQueryService/" />
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>
  <appSettings>
    <add key="userName" value="your user name"/>
    <add key="password" value="your password"/>
  </appSettings>
</configuration>  

以及客户端配置,绑定配置应与服务类似

<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="DefaultBinding_IEmployeesQueryService">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Basic"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <!--For basic http binding endpoint-->
      <endpoint address="http://127.0.0.1:12215/EmployeeQuery/"
                binding="basicHttpBinding" bindingConfiguration="DefaultBinding_IEmployeesQueryService"
                contract="IEmployeesQueryService" 
                name="DefaultBinding_IEmployeesQueryService_IEmployeesQueryService" />
    </client>
  </system.serviceModel>
  <appSettings>
    <add key="userName" value="your user name"/>
    <add key="password" value="your pass word"/>
  </appSettings>
</configuration> 

Notice

我们的重点不是构建 WCF 应用程序,而是如何配置通信以及构建验证器。我希望此页面对您构建带有身份验证的 WCF 应用程序有所帮助。

© . All rights reserved.