生成基于 basicHttpBinding 的用户名身份验证(无需证书)
使用 basicHttpBinding 创建用于用户名身份验证的应用程序。
引言
一个向导,帮助您开发一个完整的 WCF 服务和客户端,基于 basicHttpBinding
,无需证书。
背景
我接受了一项任务,需要调查使用用户名进行 WCF 身份验证。因此,我对 basicHttpBinding
和 wsHttpBinding
进行了研究。在下面的文章中,我将向您展示如何使用 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 应用程序有所帮助。