[转贴][WCF Security] 4. 用户名/密码身份验证

原文:http://www.rainsts.net/article.asp?id=475

 

X.509 比较适合验证 "客户机" 的身份,而另外一方面,我们可能需要针对具体的 "用户" 进行验证。本文将记述基于 "用户名/密码" 方式的身份验证开发步骤。

1. 服务器数字证书

我们同样需要为服务器准备一个数字证书。

D:\>makecert -r -pe -n "CN=MyServer" -ss My -sky exchange

2. 创建服务

[ServiceContract]
public interface IService
{
  [OperationContract]
  string Test();
}

public class MyService : IService
{
  public string Test()
  {
    return "Server:" + DateTime.Now.ToString();
  }
}

public class WcfTest
{
  public static void Test()
  {
    ServiceHost host = new ServiceHost(typeof(MyService));
    host.Open();
  }
}

我们通过继承 UserNamePasswordValidator 来创建一个自定义验证器。

public class MyUserNamePasswordValidator : UserNamePasswordValidator
{
  public override void Validate(string userName, string password)
  {
    if (userName != "user" || password != "pwd")
    {
      throw new SecurityTokenException("Unknown Username or Password");
    }
  }
}

接下来创建服务器配置文件,我们使用 WsHttpBinding,采取 Message 安全模式。其他的设置还包括 certificateValidationMode、userNamePasswordValidationMode、customUserNamePasswordValidatorType 等。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="NewBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceCredentials>
            <clientCertificate>
              <authentication certificateValidationMode="None" />
            </clientCertificate>
            <serviceCertificate findValue="MyServer" storeLocation="CurrentUser"
              x509FindType="FindBySubjectName" />
            <userNameAuthentication userNamePasswordValidationMode="Custom"
              customUserNamePasswordValidatorType=
                "Learn.Library.WCF.MyUserNamePasswordValidator, Learn.Library.WCF" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <wsHttpBinding>
        <binding name="Binding1">
          <security mode="Message">
            <message clientCredentialType="UserName" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="NewBehavior" name="Learn.Library.WCF.MyService">
        <endpoint address="service" binding="wsHttpBinding" bindingConfiguration="Binding1"
          name="username" contract="Learn.Library.WCF.IService" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080" />
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>
</configuration>

3. 创建客户端

启动服务器后,创建客户端代理文件。注意自动生成的客户端配置文件中包含了服务器数字证书的相关信息。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="username">
          <security mode="Message">
            <message clientCredentialType="UserName" negotiateServiceCredential="true"
              algorithmSuite="Default" establishSecurityContext="true" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:8080/service" binding="wsHttpBinding"
        bindingConfiguration="username" contract="ConsoleApplication1.localhost.IService"
        name="username">
        <identity>
          <certificate encodedValue="AwAA...IgFHqYA==" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>
</configuration>

开始调用服务,注意将 CertificateValidationMode 设置为 None,当然也可以写到配置文件中。

using (ServiceClient client = new ServiceClient())
{
  client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode =
    X509CertificateValidationMode.None;

  client.ClientCredentials.UserName.UserName = "user";
  client.ClientCredentials.UserName.Password = "pwd";

  Console.WriteLine(client.Test());
}

OK! 测试通过!

时间: 2024-10-26 15:01:11

[转贴][WCF Security] 4. 用户名/密码身份验证的相关文章

带数据库的ASP用户名密码登录验证代码

  带数据库的ASP用户名密码登录验证代码,这个代码里有登录判断的完整逻辑,包括连接数据库,查询判断用户名和密码是否正确,返回重填,关闭数据库记录集等,对ASP初学者有相当好的借鉴价值: 这里连接的是SQLSERVER数据库,数据库就不上传了,里面有两个字段,name是存储用户名,userpassword是密码字段,自己手动创建个,修改本代码里面的数据库连接信息就可测试了.

WCF与IIS集成Windows身份验证的矛盾

好久没有上来了,最近跟着原来的老大一起跳到了一家新公司,在做一个新的交友项目,今天总算基本完成了.分享一个关于WCF的小技巧,由于项目中 很多地方用了Jquery+WCF来实现Ajax异步获取数据,在开发环境下: 直接在vs.net里,右击svc文件在浏览器里浏览时(没有采用vs.net自带的aspx服务器,而是在项目属性里设置为直接使用IIS),提示以下错误: IIS 指定了身份验证方案"IntegratedWindowsAuthentication, Anonymous",但绑定仅

高分!读取文件服务器共享目录的文件,有设置用户名密码, 现在验证通不过

问题描述 文件服务器上的共享目录,用下面这段代码读取的时候,抱错用户名密码错误.错误就发生在这句:myResponse=CType(myFileWebRequest.GetResponse(),Net.FileWebResponse)完整代码如下,请问是不是还缺了什么?方案暂时不变,就是用这个.手动在浏览器输入用户名密码,下面的代码执行正常.DimtheNetworkCredentialAsNewNet.NetworkCredential("shareuser","P@ssw

求助asp.net用户名密码验证码-验证修改

问题描述 Default.aspx<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="_Default"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/

WCF security X509证书

1. Transfer Security Transfer Security 主要包括三个方面: "消息完整性(Message Integrity)"."消息机密性 (Message Confidentiality)" 和 "交互验证(Mutual Authentication)". 消息完整性必须确保消息在传输过程中没有被篡改,接收的消息是完整且正确的:消息机密性必须确保消息不会被任何第三方查阅,消息内容不会泄漏给任何非相关人员:而交互认证则是

WCF Security userName/Password

1. Transfer Security Transfer Security 主要包括三个方面: "消息完整性(Message Integrity)"."消息机密性 (Message Confidentiality)" 和 "交互验证(Mutual Authentication)". 消息完整性必须确保消息在传输过程中没有被篡改,接收的消息是完整且正确的:消息机密性必须确保消息不会被任何第三方查阅,消息内容不会泄漏给任何非相关人员:而交互认证则是

静态密码已经&quot;OUT&quot; 探索身份验证新方式

本文讲的是静态密码已经"OUT" 探索身份验证新方式,2011年末爆发了中国互联网史上最为严重的网站数据泄漏事件,很多中招用户开始修改自己的密码,"今天你改密码了吗?"成了最流行的网络问候语,很多用户都在抱怨改密码改到手软.想起互联网刚刚在国内兴起时候的一个名词:"网上冲浪",现在看来,如今的互联网用户依然是在用一个账号+一个密码在互联网上肆无忌惮的"冲浪".随着黑客技术的不断进步,这种传统的账号+密码的身份验证方式是否依然适

WebService 用户名密码验证

原文:WebService 用户名密码验证 在项目开发的过程中,WebService是经常要用的,当调用WebService方法时,需要经过服务的验证才可以调用,一般就是用户名/密码验证,还有一个就是证书.下面程序使用的是用户名/密码的方式,很简单的一个程序. 项目截图: 先看服务端的代码(ws_Service) MySoapHeader.cs   这里通过继承SoapHeader实现对用户名/密码的验证   public class MySoapHeader:System.Web.Servic

[.NET 基于角色安全性验证] 之三:ASP.NET Forms 身份验证

在开发过程中,我们需要做的事情包括: 1. 在 web.config 中设置 Forms 身份验证相关参数.2. 创建登录页. 登录页中的操作包括: 1. 验证用户名和密码是否正确.2. 创建身份验证票证对象.3. 将身份验证票证对象加密成字符串,写入 Cookies.4. 重定向到原始请求 URL. 1. 简单演示 web.config <?xml version="1.0"?><configuration>  <system.web>    &l