WCF用户名密码验证方式

WCF使用用户名密码验证

服务契约

namespace WCFUserNameConstract
{
    [ServiceContract]
    public interface IWcfContract
    {
        [OperationContract]
        bool GetOnWcfService(ref string MessageInfo);
    }
}

服务实现

namespace WcfUserNameService
{
    public class WcfUserNameService : IWcfContract
    {
        public bool GetOnWcfService(ref string MessageInfo)
        {
            MessageInfo = "调用服务成功了,这是返回来的!" ;
            return true;
        }
    }
}

服务端用户名密码验证类

namespace WcfUserNameService
{
    public class WcfValidator : System.IdentityModel.Selectors.UserNamePasswordValidator
    {
        public override void Validate(string userName, string password)
        {
            if (!(userName == "张三" && password == "123456" ))
            {
                throw new FaultException("调用服务错误,用户名或密码错误……");
            }
        }
    }
}

服务端配置(App.config)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
<system.serviceModel>
  <services>
    <service name="WcfUserNameService.WcfUserNameService" behaviorConfiguration="myBehavior">
      <endpoint address="http://localhost:8181/mywcfUsername" binding="wsHttpBinding" contract="WCFUserNameConstract.IWcfContract" bindingConfiguration="myBind"></endpoint>
    </service>
  </services>
<bindings>
  <wsHttpBinding>
    <binding name="myBind">
      <security mode="Message">
        <message clientCredentialType="UserName"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="myBehavior">
      <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8181/mywcfUsername/metadata"/>
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WcfUserNameService.WcfValidator,WcfUserNameService"/>
        <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

服务端寄宿代码

namespace WcfUserNameConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ServiceHost host = new ServiceHost(typeof(WcfUserNameService.WcfUserNameService)))
            {
                host.Opened += delegate
                {
                    Console.WriteLine("服务已启动,按任意键继续……");
                };
                host.Open();
                Console.Read();
                host.Close();
            }
        }
    }
}

客户端App.config配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <system.serviceModel>
    <client>
      <endpoint address="http://localhost:8181/mywcfUsername" binding="wsHttpBinding" contract="WCFUserNameConstract.IWcfContract" name="myEnd" behaviorConfiguration="myBehavior" bindingConfiguration="mybind"></endpoint>
    </client>
    <bindings>
      <wsHttpBinding>
        <binding name="mybind">
          <security mode="Message">
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="myBehavior">
          <clientCredentials>
            <serviceCertificate>
              <authentication  certificateValidationMode="PeerOrChainTrust"/>
            </serviceCertificate>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

客户端调用代码

namespace MyClient
{
    class Program
    {
        static void Main(string[] args)
        {
            ChannelFactory<WCFUserNameConstract.IWcfContract> factory = new ChannelFactory<WCFUserNameConstract.IWcfContract>("myEnd");
            UserNamePasswordClientCredential Uinfo = factory.Credentials.UserName;
            Uinfo.UserName = "张三";
            Uinfo.Password = "123456";
            string MessageInfo = "服务出错了!";
            IWcfContract wcf = factory.CreateChannel();
            using (wcf as IDisposable)
            {
                bool bls = wcf.GetOnWcfService(ref MessageInfo);
                Console.WriteLine("调用服务" + bls.ToString() + MessageInfo);
                Console.Read();
            }
        }
    }
}

注意想要实现上面的验证,须安装证书,

代码如下(如果已有证书不匹配,可运行mmc --- 文件---添加删除管理单元---证书--添加--计算机用户--下一步--确定。  然后  证书(本地计算机)--个人--证书-- 删除右边的证书,然后运行下面代码),

makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=localhost -sky exchange -pe
certmgr.exe -add -r LocalMachine -s My -c -n localhost -r CurrentUser -s TrustedPeople

说明:上面的第一行为安装证书,第二行为符加到信任证书。

  

时间: 2024-12-20 12:45:54

WCF用户名密码验证方式的相关文章

OpenVPN2.4.3 基于用户名密码验证方式(实战)

安装部署参考"Open'VPN安装部署文档" 基于用户名密码验证: 1.修改server.conf: tls-auth ta.key 0 # This file is secret auth-user-pass-verify /usr/local/openvpn/config/checkpsw.sh via-env client-cert-not-required username-as-common-name script-security 3 注:如果加上client-cert-n

【WCF】使用“用户名/密码”验证的合理方法

我不敢说俺的方法是最佳方案,反正这世界上很多东西都是变动的,正像老子所说的——“反(返)者,道之动”.以往看到有些文章中说,为每个客户端安装证书嫌麻烦,就直接采用把用户名和密码塞在SOAP头中发送,然后在服务器端自定义一个消息拦截器来验证用户名和密码. 以老周不靠谱的学识水平认为,这样做不好,直接把明文而且敏感信息放在SOAP头中传输,这尺度实在太大了,太暴露了,广电局是不会允许的,虽然现在流行穿得越少越好,但那些是婊子的境界.像用户名密码这些重要信息,怎么能直接传输呢,这很容易被偷窥的. 其实

Windows下搭建Openvpn使用用户名和密码验证方式如何引用shell脚本

网上找了很多资料关于Openvpn使用用户名和密码验证方式的大都是在linux环境下搭建的.其实在windows下搭建可以参考linux的情况,可以找到很多资料,主要遇到的问题是如何引用那个checkpw.sh的shell脚本.这里记下自己的经验. 为了引用此脚本,看了网上一个博客后有了点idea.首先安装Cygwin,Cygwin是一个在windows平台上运行的类UNIX模拟环境.之后写一个bat文件,如script.bat: C:/cygwin64/bin/bash.exe  C:/che

【WCF】Silverlight+wcf+自定义用户名密码验证

本文摘自 http://www.cnblogs.com/virusswb/archive/2010/01/26/1656543.html 在昨天的博文Silverlight3+wcf+在不使用证书的情况下自定义用户名密码验证 中提到了,我想实现的安全效果,就是客户端访问的时候不需要https,也不需要安装证书(商业证书客户端会自动信任),但是暴露的wcf接口不是每个人可以调用的,因为sl+wcf只支持basicHttpBinding一种绑定,在这种绑定下面其实是可以不适用传输安全,然后消息安全选

WCF 安全性之 自定义用户名密码验证

案例下载 http://download.csdn.net/detail/woxpp/4113172 客户端调用代码 通过代理类 代理生成 参见 http://www.cnblogs.com/woxpp/p/6232298.html X509证书创建 http://www.cnblogs.com/woxpp/p/6232325.html 自定义用户名密码验证需要证书的支持 服务器端配置代码 <system.serviceModel> <services> <service n

WCF全双工以及用户名密码验证

WCF是支持TCP双向连接的,支持Server和Client之间互发协议,通过 订阅-发布 的全双工形式实现,全双工的用户名密码验证需要X509证书加密,单工模式的用户名密码验证时,X509证书是可选的. 在全双工模式下,会有断线的问题,目前我还没有根本解决,在单位的项目中只是做了断线重连的处理,但希望有识之人告知更好的方法... 下面是WCF用户验证的Demo,包含单工和全双工模式,刚入门,有什么好的建议多指教. 附上Demo下载地址:WCFDemo.rar Demo运行前需要注册X509证书

WebService带用户名密码验证(复习用)

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

Python实现LDAP用户名密码验证

网上借鉴了不少东西,下面是python代码,备份后用. 思路,因为每个用户的组都不一样,这样就导致了dn不一致的情况, 据需要先根据用户名获取该用户的dn,然后再bind用户名和密码进行验证. 反正是实现了,至于方式对不对后续再研究了. 机器上要先安装python-ldap包 1 #coding: utf-8 2 import ldap 3 ''' 4 实现LDAP用户登录验证,首先获取用户的dn,然后再验证用户名和密码 5 ''' 6 7 ldappath = "ldap://xxxx&quo

Centos6.4下快速构建基于用户名密码验证的openvpn服务器

如今VPN应用已经非常广泛了,之前就写过一篇关于PPTPD的博文.链接是http://cyr520.blog.51cto.com/714067/1161788. 家里最近新换了一个宽带.居然没办法用拨上公司的PptpdVPN,一直拨号状态一直停留在正在验证用户名和密码这一步.百度谷歌了一大圈,也没解决这个问题.貌似是因为宽带运营商屏蔽GRE协议的原因.作为运维人员,不能及时的连上公司的内部网络是一件很让人不爽的事情. 干脆再搞一套OpenVPN吧,据说OpenVPN非常强大,可以适应很复杂的网络