WCF 安全
服务器端与客户端都安装证书,双方通过证书加密通讯。
配置wsHttpBinding,使用基于消息的用户名验证。首先配置为Windows账户库验证。
服务器端配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<services>
<service name="Server.EchoClaims" behaviorConfiguration="echoClaimsBehavior">
<endpoint address="EchoClaims"
binding="wsHttpBinding" bindingConfiguration="echoClaimsBinding"
contract="Server.IEchoClaims"></endpoint>
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="echoClaimsBinding">
<security mode="Message">
<message clientCredentialType="UserName"
negotiateServiceCredential="true"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="echoClaimsBehavior">
<serviceCredentials>
<serviceCertificate
findValue="CN=WCFServer"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectDistinguishedName"/> <userNameAuthentication userNamePasswordValidationMode="Windows"/> </serviceCredentials>
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel> </configuration>
服务器端WCF配置文件
客户端配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IEchoClaims">
<security mode="Message">
<message clientCredentialType="UserName" negotiateServiceCredential="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="echoClaimsBehavior">
<clientCredentials>
<serviceCertificate>
<authentication certificateValidationMode="None" revocationMode="NoCheck"/>
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint address="http://localhost:8000/EchoClaims" binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IEchoClaims" contract="EchoService.IEchoClaims"
name="WSHttpBinding_IEchoClaims"
behaviorConfiguration="echoClaimsBehavior">
<identity>
<certificate encodedValue="AwAAAAEAAAAUAAAAfrv857e8xZLzhuCQyO7qa/0wCkIgAAAAAQAAAPcCAAAwggLzMIIB36ADAgECAhAaodle1qkYlUXIdQ/PwC7IMAkGBSsOAwIdBQAwEjEQMA4GA1UEAxMHV0NGUm9vdDAeFw0xNDA0MDkwMjQ0MTlaFw0zOTEyMzEyMzU5NTlaMBQxEjAQBgNVBAMTCVdDRlNlcnZlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALyruHtFKP3kZCLphXZo3/an9RcWAZ/bDi0pNBL1wQOAXQqz+IWNYIAcL3Yu6+gTouOhEufhoeLSi6dqflxmGZ932hofR7riukGyJbOsHKCRcXuJTPXw0NvMTrJfCB6kD2nkOVgATrJfBazGQIb1OTj7kFYq2IJDIw5+M3toooaNWvF6z/ggL6DyxYuZ0rUf+bQpAhiKjBS49Ci7/LrVtnY9NxCoUTfgGbcg6A5PKf8eC0Cm2yLxnAt0yuCalWm2RlZQuMwfx1QIWV9IVla+aI5FiM2CoiVzumYp9nivZ2isy3Na2zqa0jp0Ik8Pg7c4kh1oSKLezbKYSo8ogvg2wzMCAwEAAaNLMEkwRwYDVR0BBEAwPoAQ7yxNpv71Jf0+UvKX5DgORaEYMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5ghA1FBocsiV2iUdFzYL/JyWnMAkGBSsOAwIdBQADggEBAIIXE9oU7K/6qPD1kKNXwruT5YYmHu/ogCpo5JD3keODMjakDBn7gr5wuqZsqoyvmKH8eNrTjP80crbUrdmh10Tr1V7JpbELTDFWLCyj4A/aS8a2DhpB0rksKd/sxtFu0nVJWKb/16+NZsBH6mjPYRui8id1QMDEPG29oPr0gJRuvPYtCJajgmMFGPlCanNN5diteiKf+OCWBu5D4y7Gypo2KgHXVgMz8+DkJU3e1AdGyeY3jrGzge42eM0xq2itbVL/t9FdnIeYDcUBIRiQlbDgWQIkpq6aH3G/WGFEVhbg6I0I9N4hANLTehsSe0YMfrN+8EB42BhwnYlMjFuh11k=" />
<dns value="WCFServer"/>
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>
客户端引用服务后修改配置文件
2, 自定义的成员提供程序最为身份库:
任何成员提供程序都必须派生自System.Web.MembershipProvider 基类,并且需要实现它的几个方法,以验证和管理应用程序中的用户。在WCF中只需要ValidateUser方法,用它来验证证书。
1 namespace Server
2 {
3 public class MyMembershipProvider : UserNamePasswordValidator
4 {
5 public override void Validate(string userName, string password)
6 {
7 //throw new NotImplementedException();
8 if (userName != "joe" || password != "bar")
9 {
10 throw new SecurityTokenValidationException("The user could not be authenticated.");
11 }
12 }
13 }
14 }
自定义用户验证
1 <?xml version="1.0" encoding="utf-8"?>
2 <configuration>
3 <startup>
4 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
5 </startup>
6 <system.serviceModel>
7 <services>
8 <service name="Server.EchoClaims" behaviorConfiguration="echoClaimsBehavior">
9 <endpoint address="EchoClaims" binding="wsHttpBinding" bindingConfiguration="echoClaimsBinding" contract="Server.IEchoClaims"></endpoint>
10 </service>
11 </services>
12 <bindings>
13 <wsHttpBinding>
14 <binding name="echoClaimsBinding">
15 <security mode="Message">
16 <message clientCredentialType="UserName" negotiateServiceCredential="true"/>
17 </security>
18 </binding>
19 </wsHttpBinding>
20 </bindings>
21 <behaviors>
22 <serviceBehaviors>
23 <behavior name="echoClaimsBehavior">
24 <serviceCredentials>
25 <serviceCertificate findValue="CN=WCFServer" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectDistinguishedName"/>
26
27 <userNameAuthentication userNamePasswordValidationMode="Custom"
28 customUserNamePasswordValidatorType="Server.MyMembershipProvider, Server"/>
29
30 </serviceCredentials>
31 <serviceMetadata httpGetEnabled="true"/>
32 </behavior>
33 </serviceBehaviors>
34 </behaviors>
35 </system.serviceModel>
36
37 </configuration>
相应配置文件app.config
8.3.2 建立在传输层安全至上的用户名验证
WCF 安全的更多相关文章
- WCF学习之旅—第三个示例之四(三十)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) ...
- 【WCF】使用“用户名/密码”验证的合理方法
我不敢说俺的方法是最佳方案,反正这世界上很多东西都是变动的,正像老子所说的——“反(返)者,道之动”.以往看到有些文章中说,为每个客户端安装证书嫌麻烦,就直接采用把用户名和密码塞在SOAP头中发送,然 ...
- 【WCF】错误协定声明
在上一篇烂文中,老周给大伙伴们介绍了 IErrorHandler 接口的使用,今天,老周补充一个错误处理的知识点——错误协定. 错误协定与IErrorHandler接口不同,大伙伴们应该记得,上回我们 ...
- 【WCF】自定义错误处理(IErrorHandler接口的用法)
当被调用的服务操作发生异常时,可以直接把异常的原始内容传回给客户端.在WCF中,服务器传回客户端的异常,通常会使用 FaultException,该异常由这么几个东东组成: 1.Action:在服务调 ...
- [WCF]缺少一行代码引发的血案
这是今天作项目支持的发现的一个关于WCF的问题,虽然最终我只是添加了一行代码就解决了这个问题,但是整个纠错过程是痛苦的,甚至最终发现这个问题都具有偶然性.具体来说,这是一个关于如何自动为服务接口(契约 ...
- 【原创经验分享】WCF之消息队列
最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...
- Ajax使用WCF实现小票pos机打印源码
通过ajax跨域方式调用WCF服务,实现小票pos机的打印,源码提供web方式,客户端方式测试,服务驻留右侧底部任务栏,可控制服务开启暂停,用户可自定义小票打印模板,配合零售录入. qq 22945 ...
- C# 用SoapUI调试WCF服务接口(WCF中包含用户名密码的验证)
问题描述: 一般调试wcf程序可以直接建一个单元测试,直接调接口. 但是,这次,我还要测试在接口内的代码中看接收到的用户名密码是否正确,所以,单一的直接调用接口方法行不通, 然后就想办法通过soapU ...
- WCF基础
初入职场,开始接触C#,开始接触WCF,那么从头开始学习吧,边学边补充. SOA Service-Oriented Architecture,面向服务架构,粗粒度.开放式.松耦合的服务结构,将应用程序 ...
- Mono下的WCF的Bug?
最近一段时间,一直在折腾Mono,折腾Linux.让我无比痛苦的是Mono下的WCF的坑真的是太多了,这不又遇到了一个莫名其妙的问题. 环境:mono 3.2.1,Jexus 5.4.3,OS Cen ...
随机推荐
- 分时问候——时间类、if语句
import java.time.LocalTime; public class Hello { public static void main(String[] args) { LocalTime ...
- 关于fetch请求中非表单模式(form)转化为form格式请求成功问题
首先证实一下接口请求可以成功,postman掉通 2.证实接口可以掉通之后,来发现问题 发现根本不是form表单格式3.去操作实现form表单格式 发现form格式貌似已经转换,但是请求还是不对 最后 ...
- pgsql判断字符串是否为数字
利用正则表达式来对字符串进行匹配 因为工作遇到了一个问题需要对字符串是否可以转换为数值进行判断.今天关于这个问题进行一个分享,流程如下 数字的正则表达式 ^([0-9]+.?[0-9]*|.[0-9] ...
- MAC系统连接Windows共享文件的方法:
MAC系统连接Windows共享文件的方法: 1.首先先确认Windows系统下已开启共享.并且两台电脑之间局域网已通. 2.苹果MAC系统,点击桌面.打开顶部菜单 "前往". 3 ...
- java短链接生成二维码
import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxi ...
- Docker 对于容器的增删查命令
列出所有容器 ID 1 docker ps -aq 停止所有容器 1 docker stop $(docker ps -aq) 停止单个容器 1 docker stop 要停止的容器名 删除所有容器 ...
- Linux 在miniconda和anaconda同时安装时,卸载miniconda
1. 找到miniconda目录,删除. rm -rf miniconda3/ 2. 编辑bashrc sudo vim .bashrc setup路径改回anaconda3的,注释掉"&g ...
- vue-表格拖拽
1. el-table结合sortable 参考:https://blog.csdn.net/weixin_42460570/article/details/125765599?ops_request ...
- React自定义组件参数小驼峰命名提示警告 Warning: React does not recognize the `xxXxx` prop on a DOM element.
Warning: React does not recognize the `xxXxx` prop on a DOM element. If you intentionally want it to ...
- JAVA查漏补缺 1
JAVA查漏补缺 1 目录 JAVA查漏补缺 1 基本数据类型 数组 方法参数传递机制 基本数据类型 数据类型 关键字 取值范围 内存占用(字节数) 整型 byte -128~127 1 整型 sho ...