WCF Security userName/Password

1. Transfer Security
Transfer Security 主要包括三个方面: "消息完整性(Message Integrity)"、"消息机密性 (Message Confidentiality)" 和 "交互验证(Mutual Authentication)"。
消息完整性必须确保消息在传输过程中没有被篡改,接收的消息是完整且正确的;消息机密性必须确保消息不会被任何第三方查阅,消息内容不会泄漏给任何非相关人员;而交互认证则是指客户端和服务器必须通过某种信任机制才能建立正确的连接,同时交互认证还要监测并阻止拒绝服务攻击(DOS)。通常的做法是对消息进行数字签名来确保其完整性,使用非对称加密算法来阻止消息内容外泄,而用户名/密码、X.509 数字证书等方式则可以用来验证对方身份,在这里我们主要讲述如何在WCF中使用用户名/密码的身份验证方式.

2. 创建x.509数字证书:

要使用userName/password方式来验证身份,我们需要为服务器装一个证书,创建证书的作用是因为用户名和密码在client和service传输的过程中需要加密,否则就没有安全性了,x.509rd使用非对称加密加技术.用公钥加密客户端用户名和密码,在服务端用私钥来解密,所以我们得创建这样的证书.使用vs2008的tool中的command命令下执行:makecert -r -pe -n "CN=Temp" -ss My -sky exchange  .我们就可以为服务器生成Temp的证书.如下图所示.

点击view可以查看详细信息:

 

 X.509 简单证书介绍:

  X.509给出的鉴别框架是一种基于公开密钥体制的鉴别业务密钥管理。一个用户有两把密钥:一把是用户的专用密钥,另一把是其他用户都可利用
的公共密钥。用户可用常规密钥(如DES)为信息加密,然后再用接收者的公共密钥对DES进行加密并将之附于信息之上,这样接收者可用对应的专用密钥
打开DES密锁,并对信息解密。该鉴别框架允许用户将其公开密钥存放在它的目录款项中。一个用户如果想与另一个用户交换秘密信息,就可以直接从对方
的目录款项中获得相应的公开密钥,用于各种安全服务。更多的可以参考MSDN
3.Solution 结构如下图:
solution:WCFValidationContract WCF contract.
     WCFValidationClient WCF client端.
     WCFValidationServices 主要是实现contract的类
     WCFValidationHost..用于启动WCF.
创建服务
    [ServiceContract]
    public interface IUserName//对应solution中的WCFValidationContract.IUserName
    {
        [OperationContract]
        bool test();
    }
    public class UserName:IUserName//对应solution中的WCFValidationServices.UserName
    {
        #region IUserName Members
        public bool test()
        {
            return true;
        }
        #endregion
    }
我们通过继承 UserNamePasswordValidator 来创建一个自定义验证器。//对应solution中的WCFValidationServices.MyValidation
      public override void Validate(string userName, string password)
        {
            //the follow code is testing only.u can read userName and password from DataBase.
            if (userName != "user" || password != "pwd")
            {
                throw new Exception("Unknown Username or Password");
            }
        }
服务端的配置文件如下:(host的配置文件)
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="UserNameBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceCredentials>
            <issuedTokenAuthentication allowUntrustedRsaIssuers="true"></issuedTokenAuthentication>
            <clientCertificate>
              <authentication certificateValidationMode="None"/>
            </clientCertificate>
            <serviceCertificate findValue="Temp" storeLocation="CurrentUser" x509FindType="FindBySubjectName"/>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCFValidationServices.MyValidation,WCFValidationServices"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <wsHttpBinding>
        <binding name="userBinding">
          <security mode="Message">
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="UserNameBehavior" name="WCFValidationServices.UserName">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="userBinding" name   ="username" contract="WCFValidation.IUserName">
          </endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/userName"/>
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>
</configuration>
有时候我们在启动服务的时候会生产如下的错误:
这时我们需要使用微软件提供的WCF Samples中的一个工具FindPrivateKey来长到Temp的私钥文件的位置,然后为ASPNET或NET Service用户分配访问权限
WCF Samples下载地址 http://download.csdn.net/source/792492也可以到MSDN上下载
FindPrivateKey的使用介始: http://msdn.microsoft.com/zh-cn/vbasic/aa717039.aspx
4. 创建客户端

启动服务器后,创建客户端代理文件。注意自动生成的客户端配置文件中包含了服务器数字证书的相关信息。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="username" closeTimeout="00:01:00" openTimeout="00:01:00"
            receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false"
            transactionFlow="false" hostNameComparisonMode="StrongWildcard"
            maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
            allowCookies="false">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00"
              enabled="false" />
          <security mode="Message">
            <transport clientCredentialType="Windows" proxyCredentialType="None"
                realm="" />
            <message clientCredentialType="UserName" negotiateServiceCredential="true"
                algorithmSuite="Default" establishSecurityContext="true" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost/userName" binding="wsHttpBinding"
          bindingConfiguration="username" contract="IUserName" name="username">
        <identity>
          <certificate encodedValue="AwAAAAEAAAAUAAAAqxw7daba6mcItJ/tKIAFZfz3TCggAAAAAQAAAPcBAAAwggHzMIIBXKADAgECAhAciN6VY5e8ik4b7Ia5KvftMA0GCSqGSIb3DQEBBAUAMBMxETAPBgNVBAMTCE15U2VydmVyMB4XDTA4MTEyMDA2MTQwNloXDTM5MTIzMTIzNTk1OVowEzERMA8GA1UEAxMITXlTZXJ2ZXIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALK4gy7ldnVwSjemT3bQjKSEGd/zBjNqYDHf9kwUopwvuHpE287yWD1ytKaYYZf7uEdEtNYKwWeOwSNLEPqxUSW4jF92IqfQwkxa0bQdZQK/Y3TpmseX/hsOtW0FBXV3Ftqq+acrWVkG/J/HFM1eeIyPggVI/QqclrKjBQeikjMdAgMBAAGjSDBGMEQGA1UdAQQ9MDuAEEvEZkpRY3c664NiQiazM3+hFTATMREwDwYDVQQDEwhNeVNlcnZlcoIQHIjelWOXvIpOG+yGuSr37TANBgkqhkiG9w0BAQQFAAOBgQAQLrEU3mnxOlDkKuVx9OatXd0w99I3xMnQOsWvOCITjQrfUeJWz1FOl46pKAXDhJNgfMW133E3ARgUxf+abkJqz9ejhjvzJwx2CJYe843h98fooTPPbSs6rQrfQOxb/KoaxbKoxUaALQsGssEXkN2ImS0jsOUm9aVNnRNWpKMhzA==" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>
</configuration>
以配置文件是由svcutil工具生成的.我们在客户端写以下代码来调用服务:
  UserNameClient aa = new UserNameClient();
aa.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
  aa.ClientCredentials.UserName.UserName = "user";
  aa.ClientCredentials.UserName.Password = "pwd";

  bool flag = aa.test();
  Console.WriteLine(flag.ToString());
  Console.ReadKey();
这时我们可以在控制应用程序中显示True这个值.
当我们输入一个错误的密码时如:
 aa.ClientCredentials.UserName.UserName = "123";
  aa.ClientCredentials.UserName.Password = "123";
客户端就会有异常:
 

 
 这样我们不可以完成了WCF的 userName/password的验证方式,在项目中使用时,我们不必要在每次调用方法的时候设置用户名和密码,我们只要写一个基类就可以了
 
 

转载于:https://www.cnblogs.com/liujiang/archive/2008/11/21/1338384.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sencha Touch2中数据的获取

根据Sencha Touch技术框架的特点&#xff0c;前台展示的绝大部分数据都是通过ajax方式获取&#xff0c;譬如列表数据的获取、表单数据的获取等等。列表数据的获取&#xff0c;一般是通过store组件和list组件进行结合&#xff1b;表单数据的获取通常使用Ext.request方式获取。列…

boost库中mutex、condition_variable与mutex::scoped_lock联合使用实现线程之间的通信

最近在公司负责一个线程池的模块&#xff0c;里面用到了boost库中的mutex、condition_variable与mutex::scoped_lock&#xff0c;在此总结下线程池在使用时的方式和要点&#xff0c;这里记录了线程之间的通信方式&#xff0c;希望对学习线程之间(同一个进程)通信的同志们有所帮…

caffe运行训练脚本时报错:Unknown bottom blob 'data' (layer 'conv1',bottom index 0)

报错的两种报错原因&#xff1a; 1.输入数的路径错误&#xff0c;需要将路径进行修改排查目录是否出错 2.训练原数据格式不对 3.train.prototxt文件中并未设置test层&#xff0c;而在solver层则设置了test的迭代等参数 两种解决方法 1.对错误原因1&#xff0c;则改为正确路径 2…

保护视力,我写的一个定时提醒的小玩意。

做程序员2年了&#xff0c;感觉视力越来越差。有时候常常工作到忘记休息。于是就想写一个能够定时提醒的小东西(公司不让从网络下载别的程序)。 功能: 1.能够每隔一段时间提醒我休息&#xff0c;做做眼保健操。 2.能够自己设定时间间隔. 运行环境&#xff1a;.ne…

Matrix Computations 1

matrix computation转载于:https://www.cnblogs.com/stoneresearch/archive/2012/06/05/4336290.html

Linux下修改只读文件

最近在linux Ubuntu下配置hadoop&#xff0c;遇到了一个只读文件core-site.xml&#xff0c;需要修改其中的内容&#xff0c;但是该文件是只读的。查了资料比较简单&#xff1a; chattr -i 文件 让只读文件可编辑 chattr i 文件 让文件只读 ubuntu下使用&#xff1a; sud…

动态dp模板题(树剖+dp+线段树)

动态最大带权独立集 &#xff08;还有一个是全局平衡二叉树的解法&#xff0c;还没学&#xff09; 1 #include"bits/stdc.h"2 3 using namespace std;4 const int inf 1e8;5 int n,m;6 int v[100005];7 const int nn 1e510;8 9 int link[nn<<1],son[nn<&l…

×××linux下vsftp服务器

一、编译安装vsftp [rootYYzs tmp]# tar -xvf vsftpd-2.2.0.tar.gz[rootYYzs tmp]# cd vsftpd-2.2.0[rootYYzs vsftpd-2.2.0]# make//vsftp默认配置中需要“nobody”用户&#xff0c;在系统中添加此用户[rootYYzs vsftpd-2.2.0]# useradd nobody//VSFTPD默认配置中需要“/usr/s…

WinCE程序的几种开发方法

文章允许转载,请注明出处和作者:luocq(akay_21cn_com)下面介绍的几种开发方法,还是倾向于Delphi的程序员,如果是熟练的VC程序员,当然VC是不二的选择.1、采用Delphi2007来进行WinCE .net程序开发http://spaces.msn.com/members/GordonLiWei/?partqsayear%3D2005%26amonth%3D12&…

几道Linux驱动相关面试题,你会几题?

1一、Linux基础1、任意3种网络操作的Linux命令,并说明他们的含义 1. ifconfig 命令ifconfig 用于查看和配置 Linux 系统的网络接口。 查看所有网络接口及其状态&#xff1a;ifconfig -a 。 使用 up 和 down 命令启动或停止某个接口&#xff1a;ifconfig eth0 up 和 ifconfig et…

解决Too many open files问题

转载&#xff1a;https://blog.csdn.net/zhuwinmin/article/details/72730288 当用linux做高并发服务器时&#xff0c;会遇到"Too many open files"的错误。 Linux是有文件句柄限制的&#xff08;open files&#xff09;&#xff0c;而且Linux默认不是很高&#xf…

RedHat Linux 5.5系统下配置yum包详细过程

1、挂载光盘 mount -t iso9660 /dev/dvd /mnt/cdrom2、建立文件夹 安装如下路径&#xff0c;建立对应的文件夹&#xff0c;其中pub文件夹需要创建4个。3、复制以下内容到指定文件夹 需要注意的是&#xff0c;如果按照第1步将光盘挂在到/mnt/cdrom 下面…

hadoop fs 基本命令

今天由于工作需要&#xff0c;需要使用到hadoop fs的一些命令&#xff0c;就简单的总结了下&#xff1a; 1&#xff0c;hadoop fs –fs [local | <file system URI>]&#xff1a;声明hadoop使用的文件系统&#xff0c;如果不声明的话&#xff0c;使用当前配置文件配置的…

树莓派的这十年

来源 | 新智元编辑 | 袁榭 好困刚刚过完10岁生日的树莓派&#xff0c;早已褪去了当年廉价电脑教具的外衣&#xff0c;一跃成为全球业界首屈一指的微型电脑品牌。为啥叫「Raspberry Pi」&#xff1f;从某种意义上讲&#xff0c;「树莓」这个命名方式其实很单纯&#xff0c;因为大…

存储过程入门与提高

什么是存储过程呢&#xff1f; 定义&#xff1a; 将常用的或很复杂的工作&#xff0c;预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。 讲到这里,可能有人要问&#xff1a;这…

C++ 11 nullptr关键字

C 11 nullptr关键字 转载&#xff1a;https://www.cnblogs.com/DswCnblog/p/5629073.html 熟悉C的童鞋都知道&#xff0c;为了避免“野指针”&#xff08;即指针在首次使用之前没有进行初始化&#xff09;的出现&#xff0c;我们声明一个指针后最好马上对其进行初始化操作。如…

Vue-watch选项

Vue ----watch 选项 用于 监听数据变化&#xff1a; 1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <meta name"viewport" content"widthdevice-width, initial-scale1.0"…

对SqlServer2008中的日志进行截断的方法

--第一步、执行以下语句&#xff1a; USE 数据库名 GO --第二步、备份数据库日志到c:\1.bak中 BACKUP LOG 数据库名 to diskc:\1.bak GO --第三步、查询此数据库的逻辑文件名 DECLARE Log_FileName VARCHAR(256) SELECT Log_FileNamename FROM sys.database_files WHERE FILE_I…

layui 在springboot2.x 时,页面展示不了layui的问题

[[]]是thymeleaf的内联表达式&#xff0c;在script上加 th:inline"none" 即可 报错信息 转载于:https://www.cnblogs.com/SeaWxx/p/10287505.html

ArcGIS Flex API 中的 Flex 技术(一)--事件

作者&#xff1a;Flyingis 本文严禁用于商业目的&#xff0c;如需转载请注明作者及原文链接&#xff0c;其他疑问请联系&#xff1a;dev.vip#gmail.com 在ArcGIS Flex API中探索Flex使用是一种不错的学习方法&#xff0c;可以相互辅助理解ArcGIS Flex API和Flex&#…