VS2010 WCF用户名密码X.509验证

VS2010使用MFC制作有验证登陆窗口的简易计算器 利用VS2010的MFC制作了一个带有验证用户名和密码的简易计算器,并对登陆过程出现错误进行相应反应,并默认登陆名为guest,在源代码中可以更改,算是简易开发吧,打开工程项目Calc.sln运行就行了 立即下载

        WCF支持多种认证技术,例如Windowns认证、X509证书、Issued Tokens、用户名密码认证等,在跨Windows域分布的系统中,用户名密码认证还是比较常用的,要实现用户名密码认证,就必须需要X509证书,为什么呢?因为我们需要X509证书这种非对称密钥技术来实现WCF在Message传递过程中的加密和解密,要不然用户名和密码就得在网络上明文传递!详细说明就是客户端把用户名和密码用公钥加密后传递给服务器端,服务器端再用自己的私钥来解密,然后传递给相应的验证程序来实现身份验证。

       在网上搜了很多WCF认证相关文章,才最终把X.509用户名密码认证搞定,现在把自己的理解和经验总结如下:

       服务器环境:1、windows server 2003 sp2   2、IIS6.0

       客户端环境:1、winXP, win7

       开发环境:VS2010,HttpAnalyzer V5

 开发步骤:

1、用VS2010创建WCF服务应用程序,如下图所示。

WCF模板已经有默认的服务,在此不需另外编码就行。再次,首先我们要编写自己的用户名密码认证逻辑,先要在WCF项目上添加引用'System.IdentityModel'然后我们建立一个新的类文件并继承自'System.IdentityModel.Selectors.UserNamePasswordValidator',然后我们重写里面的'Validate'方法来实现用户名密码认证逻辑。代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IdentityModel;
using System.IdentityModel.Selectors;
using System.IdentityModel.Tokens;

namespace WCFServerOne
{
    public class MyCustomValidator : UserNamePasswordValidator
    {
        public override void Validate(string userName, string password)
        {
            if (userName != "lyx" || password != "123")
            {
                throw new SecurityTokenException("用户名或密码错误!");
            }
        }
    }
}
上面只是一个简单的验证,实际应用中用户名和密码一般都保存在数据库中,如果验证不通过就抛出一个'SecurityTokenException'类型的异常;下一步我们需要配置一下服务端的webConfig文件,在修改配置文件之前我们先在win2003 IIS6.0上生成x.509证书,命令是VS2010 Visual Studio Tools自带的makecert.exe,一般2003服务器上没有,你可直接拷贝过去。命令格式(在cmd窗口输入):

makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=MyServerCert -sky exchange –pe

1、需要注意的是需要查看win2003是否安装证书组件,如果没有安装,需要在控件面板添加删除程序中,安装win2003证书组件。在安装的过程中有可能需要安装CD。SP2的需要SP2 安装CD。

2、执行以上命令之后,在证书管理中就可以查看名为MyServerCert的证书了。接下证书就不需要去管它了(IIS也不需Https,我们只用X.509加密就行),我们来修改上面WCF服务的Web.Config文件,如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="mySecureBinding">
          <security mode="Message">
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </wsHttpBinding>  
    </bindings>
    <services>
      <service behaviorConfiguration="MySimpleServiceBehavior" name="WCFServerOne.MyServiceOne">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="mySecureBinding"
          contract="WCFServerOne.IServiceOne">
          <identity>
            <dns value="MyServerCert" />
          </identity>
        </endpoint>
      </service>
    </services>
    
    <behaviors>
      <serviceBehaviors>
        <behavior name="MySimpleServiceBehavior">
          <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
          <serviceDebug includeExceptionDetailInFaults="false"/>

          <serviceCredentials>
            <serviceCertificate findValue="MyServerCert" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My"/>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCFServerOne.MyCustomValidator,WCFServerOne"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
  
</configuration>

security mode="Message"
这个需要配置成Message

endpoint 需要注意的上 contract 写的是接口,behaviorConfiguration="myClientBehavior"在下面定义,名字一定不能错,不然自定验证就不会生效,如上所示。

ServiceCertificate节中指定了我们的X509证书的位置,以用来加解密message,usernameAuthentication节中指定了我们自己的用户名密码验证逻辑。

1、用VS2010创建WCF服务应用程序,如下图所示。

在项目添加服务引用,服务引用是IIS发布的地址,如:http://118.186.240.182:8090/MyServiceOne.svc 就会像WebService一样生成一个代理类,调用形式也是一样如:

 private void button1_Click(object sender, EventArgs e)
        {
            MyWCFOne.ServiceOneClient client = new MyWCFOne.ServiceOneClient();
            client.ClientCredentials.UserName.UserName = "lyx";
            client.ClientCredentials.UserName.Password = "123";
            textBox1.Text = client.GetData(10);
        }

如果你有一个真正的X509证书,那么现在的代码就可以正常运行了。但是很不幸,我们的证书是测试用的,我们运行的时候出错:'X.509 certificate CN=MyServerCert 链生成失败。所使用的证书具有无法验证的信任链。请替换该证书或更改 certificateValidationMode。已处理证书链,但是在不受信任提供程序信任的根证书中终止',WCF无法验证测试证书的信任链,那我们要做的就是绕过这个信任验证,具体做法如下:

先要在Asp.net Web应用程序项目上添加引用'System.IdentityModel'然后我们建立一个新的类文件并继承自'System.IdentityModel.Selectors.X509CertificateValidator',然后我们重写里面的'Validate'方法来实现我们自己的X509认证逻辑,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IdentityModel.Selectors;
using System.IdentityModel.Tokens;
using System.Security.Cryptography.X509Certificates;

namespace WCFClient
{
    class MyX509Validator : X509CertificateValidator
    {
        public override void Validate(X509Certificate2 certificate)
        {
            if(certificate == null)
            throw new ArgumentNullException("X509认证证书为空");
        }
    }
}
你可以把Validate方法里面留空让所有的认证都通过,也可以自己定义认证逻辑,如果认证失败,就抛出'SecurityTokenValidationException'的异常,然后我们配置一下客户端的webconfig让它使用我们自己的X509认证,增加以下的配置节,并在'endpoint'节中指定behaviorConfiguration="myClientBehavior"。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IServiceOne" 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" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://118.186.240.182:8090/MyServiceOne.svc"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IServiceOne"
                contract="MyWCFOne.IServiceOne" name="WSHttpBinding_IServiceOne" behaviorConfiguration="myClientBehavior">
                <identity>
                    <dns value="MyServerCert" />
                </identity>
            </endpoint>
        </client>
      <behaviors>
        <endpointBehaviors>
          <behavior name="myClientBehavior">
            <clientCredentials>
              <serviceCertificate>
                <authentication certificateValidationMode="Custom" customCertificateValidatorType="WCFClient.MyX509Validator,WCFClient"/>
              </serviceCertificate>
            </clientCredentials>
          </behavior>
        </endpointBehaviors>
      </behaviors>
    </system.serviceModel>
</configuration>
OK,客户端代码和配置完成,现在你可以运行自己的程序了,运行界面如下:

点击提交,会调用远程,GetData然后显示在文本框内,如下图所示:



VS2010 C++完整版登陆密码设置程序代码 在VS2010的编程环境下,利用C++语言,进行登陆密码的设置程序的制作,包括界面,与修改密码的代码`界面。其用户名与密码都同时写入ini配置文件中。每次开启exe,程序将自动读取。修改后,程序自动保存到ini配置文件中 立即下载

相关推荐

国央企创新负责人如何通过平台实现科研成果的快速识别与转化?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

.NET使用VS2010开发Web Service

Web Service是一个面向服务的架构(SOA),不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互。基于.NET平台,可以使用Visual Studio来开发Web Service。不同于Java平台,需要使用开源组件(Axis2、CXF等),微软直接在Visual Stuido里集成了开发Web Service的功能,

渴望,就奋力追寻... 3336

PotPlayer自用皮肤

自用 PotPlayer 皮肤,仅微调了字体大小与颜色,是按个人习惯调整,未做适配性调整。

【WCF安全】WCF 自定义授权[用户名+密码+x509证书]

1.x509证书制作(略) 2.直接贴代码 ----------------------------------------------------------------------服务端------------------------------------------------------------------------------------------- WCF服务 ...

weixin_30383279的博客 135

Ubuntu 26.04 本地安装 GitLab CE 完整教程(非 Docker 方式)

本文详细介绍了在Ubuntu 26.04系统上通过Omnibus包安装GitLab CE的完整流程。主要内容包括:环境准备(系统要求、依赖安装)、配置清华镜像源、执行安装命令、修改配置文件、服务管理命令以及常见问题解决方法。文章特别强调了内存要求(建议4GB以上)、首次登录密码获取、HTTPS安全配置等关键点,并提供了性能优化建议和安全设置指导。相比Docker方式,Omnibus安装具有性能更好、管理方便等优势,适合需要私有化部署GitLab的场景。

1371

认知网络分析实战:用Python复现课堂对话研究(含LSA代码)

本文通过Python实战,详细演示了如何运用认知网络分析(ENA)和滞后序列分析(LSA)两种方法,对课堂对话数据进行深度挖掘。文章提供了从数据清洗、行为编码到网络构建、序列统计及可视化的完整代码流程,帮助教育研究者和数据分析师量化分析对话中的认知结构与动态互动模式,从而获得超越文本表面的研究洞见。

weixin_28559803的博客 155

WCF RestFul+JWT身份验证

文章目录前言一、JWT是什么?二、如何使用JWT身份验证1.前端-用户登录成功后,服务端通过jwt生成一个随机token给用户2.前端-用户访问时需携带token,发给服务端3.后端-用户访问时需携带token,发给服务端4.服务端接收到token之后,通过jwt对token进行校验是否超时、是否合法二、校验接口总结 前言 之前已经介绍了restful风格wcf,本篇将介绍一下,调用restful的权限认证的内容。在调用的接口,为了安全,总会需要对请求进行权限认证的,以防一些非法的操作。 提示:以下是本

panda_225400的博客 1062

从一个过气考渣的角度看LLM智能化测试用例生成

根据业务需求生成测试用例,会涉及到相关上下文的召回、用例生成等场景。除了用例生成之外,也可以考虑应用LLM进行用例评审。因此,本文将涉及以下内容。

software_test010的博客 829

SP2010开发和VS2010专家"食谱"--第一章节--列表和事件Receiver(2)--当增加项目时验证数据

这个食谱中,我们将学到如何给ItemAdding同步事件创建自定义事件处理器。我们将在给联系人添加数据时验证数据。我们会验证电话号码和邮件地址的格式。电话号码必须是美国格式。必须包含3个数字,可能在括号内,然后是一个三个数字集合和一个四个数字集合。邮件地址应该遵从标准邮件格式。我们不允许在这些字段中增加垃圾信息。如果数据失败,我们自定义的验证会取消事件,数据也不回插入到列表了。     准备

NetSuite 张老师 1482

人形机器人人机交互解决方案(2026完整版)

《人形机器人人机交互解决方案(2026完整版)》摘要 本项目针对2026年人形机器人产业爆发式增长需求,提出了一套完整的人机交互解决方案。方案包含十大核心模块(语音识别、情感识别、手势识别等),采用五层架构设计,实现多模态融合交互,响应时间≤32ms,准确率≥99%。覆盖制造业巡检、家庭服务等10大场景,适配20+主流机型。项目总投资4.1亿元,预期年营收8.2亿元,将申请专利120项,培养专业人才300人。通过技术创新解决当前交互体验生硬、安全可控性不足等痛点,助力我国人形机器人产业实现从"跟跑

随读手记 776

服务器被黑?快速检测和识别系统中的恶意进程

在管理服务器时,检测和识别系统中的恶意进程至关重要。本文介绍了使用 `ps`、`top`、`htop` 等系统监控工具,分析日志文件,以及使用 `chkrootkit` 和 `rkhunter` 等安全工具的方法。通过这些步骤,可以有效地检测和处理恶意进程,确保系统的安全和稳定。

_midnight的博客 1416

X509格式的证书校验(基于GMSSL2019-06-15版本)

实现X509格式证书的链式校验 // cert_public.cpp : Defines the exported functions for the DLL application. // #include "stdafx.h" #include <string.h> #include <stdio.h> #include <strin...

weixin_30426065的博客 527

Autosar PNC网络管理配置(1)-基于ETAS软件

Autosar PNC网络管理配置(1)-基于ETAS软件

赞的博客 2728

WCF账户密码认证

记录一下我实现WCF用户认证与权限控制的实现方法, 也让其他网友少走一些弯路. 内容写得非常小白(因为我也是小白嘛), 比较详细, 方便WCF知识基础薄的朋友 主要分为下面几个步骤 作为例子, 创建最简单的WCF服务 生成X.509证书, 并导入到服务端和客户端 为服务提供帐号密码验证程序, 并配置App.config 生成客户端并配置其App.config ...

weixin_30764137的博客 166

Python 爬虫实战:去哪儿网机票价格爬取与出行比价分析

本文介绍了一个基于Python的机票价格监控系统,通过爬取去哪儿网数据实现多航线查询与智能比价。系统采用requests+BeautifulSoup+selenium技术栈,具备以下功能: 实时查询指定航线价格 历史价格追踪与分析 最低价推荐与价格预警 数据可视化展示 文章详细解析了去哪儿网的页面结构和反爬机制,提供了Selenium浏览器的完整配置方案,并实现了一个可稳定运行的机票采集爬虫。该系统能帮助用户掌握价格波动规律,选择最优购票时机,每年可节省可观的出行成本。

u014481728的博客 668

Cesium 实战 04 - 标绘功能系列之画点(draw point)

Cesium 实战 - 标绘功能之画点(draw point)。

非科班Java出身GISer的博客 1083

WCF 匿名客户端证书安全验证

之前介绍过X.509证书的一些知识,http://xiaogangblog.com/archives/224 可以参考这篇. 本篇要介绍的是 匿名客户端证书验证,简单的说就是 服务器端提供证书签名, 客户端匿名调用. 匿名客户端验证有什么用?可以建立相对安全的链接,对于一些不是很重要的数据传输。避免了每次让客户端都验证证书的麻烦。也可结合前文讲的自定义用户名密码来提升安全级别。 (现在的购买...

weixin_30408739的博客 378

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

WCF::X.509 certificate CN=MYHost 链生成失

问题描述:X.509 certificate CN=MYHost 链生成失败。所使用的证书具有无法验证的信任链。请替换该证书或更改 certificateValidationMode。已处理证书链,但是在不受信任提供程序信任的根证书中终止。错误分析: 证书非正式证书,即非受信任证书.解决办法: 在测试时用 makecert.exe 生成证书 需添加 -r 参数,即自己颁发给自己.供在测...

weixin_30693183的博客 291

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

一起谈.NET技术,VS2010 测试功能之旅:编码的UI测试(4)-通过编写测试代码的方式建立UI测试(下)...

  回顾   最近比较忙,距离上次更新的时间较久,见谅。   在本章上部分,介绍了“添加用户”窗口的测试代码编写。想必大家也看到了,在UIMap.cs文件中实现自定义编码是一件很轻松的事情,接下来将介绍下个部分,查询用户窗体的测试代码的编写,以及他们测试的关联。   示例程序介绍   系统主窗口:(下载点我)   该系统拥有两个功能,“添加用户”和“查询用户”:   点击添加用户后,进入添加用户...

weixin_34001430的博客 133

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

WCF的用户名密码认证

以前我们用WebService做分布式系统的时候,认证是个麻烦的问题,通常的做法是继承一个SoapHeader,把用户名和密码放到里面,每调用一个方法都要把用户名和密码传递给服务器端来验证 ,效率相当低,代码编写相当的麻烦,而且还不安全! WCF支持多种认证技术,例如Windowns认证、X509证书、Issued Tokens、用户名密码认证等,在跨Windows域分布的系统中,用户名密码认...

weixin_34247299的博客 193

替换证书,造成bad_certificate

系统调用外部的web service,走https方式,今天测试人员自己替换了https证书之后,说调用不通了,我协助定位了一下,在此记录一下定位过程,作为记录 查看cxf日志,发现以下错误信息: javax.xml.ws.soap.SOAPFaultException: Received fatal alert: bad_certificate Caused by: org.apache.

kyfxbl 5308

X.509证书的解析、验证及使用

X.509证书的解析、验证及使用 1.概述 1.1 简介 X.509格式证书是被广泛使用的数字证书标准,是用于标志通讯各方身份信息的一系列数据。 1.2常见的X.509格式证书 .cer/.crt是用于存放证书,以二进制形式存放,不含私钥 .pem跟.crt/.cer的区别是它以Ascii来表示,可以用于存放证书或私钥。 .pfx/.p12用于存放个人证书/私钥,他通常包含保护密码,

liuxiaoxiaocsdn的博客 5万+

vs2010MFC atm登录系统

vs2010MFC atm登录系统 本程序为VC++面向对象程序设计课程设计三级项目题目,解压缩后打开atm登录系统3.sln即可修改程序,运行文件在Debug文件夹中,运行前请仔细阅读readme.txt文件。 程序功能: 1、 登录功能:输入账号和密码进行登录,如密码错误提示重新输入密码,如账号错误提示无此账户。 2、 查询功能:查询账户余额。 3、 取款功能:取款,更新余额。 4、 修改密码...

qq_39069686的博客 1284

vs 2010 专业版 密钥

YCFHQ-9DWCY-DKV88-T2TMH-G7BHP 转载于:https://www.cnblogs.com/daretodream/archive/2013/04/02/2995147.html

weixin_34351321的博客 2万+

VS2005.NET C# 编写验证码:

来自:http://zhidao.baidu.com/question/25377425.htmlusing System; using System.Data; using System.Configuration; using System.Collections; usin

拓 646
上一篇: 程序中得到百度的搜索结果
下一篇: T_SQL利用游标遍历表记录,更新每条记录ID值
通者归来
博客等级 码龄25年 18粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值