WCF 第八章 安全 客户端认证

一个服务的客户端认证是通过向服务提供一系列信赖的声明。声明可以是任何形式,只要客户端和服务端理解这个格式并信赖它的来源就可以。

  如果客户端和服务端共享一个秘密信息,比如一个用户名和密码,只要客户端通过一个合法认证发送数据,服务端就相信客户端所说的。这是HTTP基本认证架构。在一个客户端机器和服务器运行在活动目录或者域中定义的账户的Windows-Only环境中,客户端和服务端已经是一种信赖关系。在这种情况下,可以使用Windows 认证,而Kerbeors或者NTLM令牌将会使用。如果客户端和服务端都信赖一些第三方组织而且不是一个Windows域的一部分时,基于证书的认证时最适合的,这样客户端可以从源获取一个服务端信任的证书并发送给服务端。

  当安全模式设置为Transport时,一个服务端在transport元素的clientCredentialType属性中确定客户端认证要求。这是通过在服务端的服务描述中的绑定配置中完成的,可以在配置文件中或者代码中定义。不同的绑定有不同的客户端认证元数据。表8.1简要列出了内建绑定的选项。

表8.1 传输安全的客户端认证

2011011120154883.png

  当使用基于传输安全的客户端认证时,客户端必须在发送消息前向信道附加声明。客户端必须附加符合服务要求的声明。例如,如果基本认证需要一个基于HTTP的绑定,客户端必须发送一个用户名和密码。如果有任何绑定需要证书认证,客户端必须使用它的私钥对消息签名并从一个由服务端信赖的权威组织发送一个数字证书(如果服务端还没有数字证书)。

使用基本认证和basicHttpBinding的认证过程

列表8.4, “使用basicHttpBinding加密”,描述了一个使用basicHttpBinding传输安全模式来通过SSL实现加密的服务配置文件。为了向这个例子中添加用户名/密码,需要将clientCredentialType属性改为Basic.列表8.6显示了一个实现的一个要求在传输层认证的改变的配置文件的片段。这个服务将很适合互联网通信因为认证通过一个安全传输层传输。

列表8.6 使用basicHttpBinding的基本认证

            <basicHttpBinding><binding name="MyBinding"><security mode="Transport"><transport clientCredentialType="Basic"><extendedProtectionPolicy policyEnforcement="Never" /></transport></security></binding></basicHttpBinding>

  当使用基本认证时,客户端必须向服务端传递一个用户名和密码。这个使用一个代理类或者直接在信道上完成的。列表8.7显示了终结点使用basicHttpBinding和基本认证向服务端传输证书的客户端代码。

列表8.7 从一个客户端传递用户名和密码

proxy.ClientCredentials.UserName.UserName = "MyDomain\\Me";

proxy.ClientCredentials.UserName.Password = "SecretPassword";

  当安全风险不是很大时且在一个客户端和一个服务端共享一条私有消息是可行的时候使用基本认证模式或者用户名/密码认证模式是合适的。因为密码很容易存储在人们桌面上的即时日志中,数据库表里或者配置文件中,所以它们很容易被拷贝或者不被注意的情况下被查看。为了保持它们”新鲜”,它们频繁的无效(“你的密码将会在10天内过期”)所以有额外的开销涉及进来。额外的,因为人们常常在多个账户中重用同一个密码,一个账户的危机可能导致其他系统危机。

使用Windows 证书认证

其他的认证方案比用户名/密码方式更加更全。如果你在一个有活动目录的Window 环境中工作,可以使用Windows认证。这需要客户端的用户/进程的身份信息并向服务端发送这些证明信息。这是一个单点登录解决方案,在这个方案中档用户登录到Windows域中后,用户的证书可以可以自动的从客户端机器传输到服务端。当使用Windows认证时,列表8.7显示的客户端代码就不需要了。列表8.8显示了使用Windows认证的net.tcp绑定。

列表8.8 使用basicHttpBinding的Windows认证

            <basicHttpBinding><binding name="MyBinding"><security mode="Transport"><transport clientCredentialType="Windows"><extendedProtectionPolicy policyEnforcement="Never" /></transport></security></binding></basicHttpBinding>

使用证书和netTcpBinding认证

数字证书相比密码可以提供一个更加广泛形式的验证。对要求安全的场景来说,快,基于证书的通信,netTcpBinding是一个好的选择。可以在复杂局域网中找到证书与混合安全模式一起工作,包括Windows, UNIX和第三方的LDAP 认证。在互联网上,如果你需要快速的,安全的服务到服务的通信,而且你可以确定哪个防火墙端口打开了,netTcpBinding可以证明是非常有价值的。使用基于证书的NetTcpBinding连接了快速通信和鲁棒性安全。

  列表8.9 显示了一个使用传输层安全的服务配置和一个基于证书的客户端认证。有很多点是没有价值的。首先,服务通过在NetTcpBinding绑定中使用clientCredentialType来配置为需要客户端证书。其次,服务的证书在<serviceCredential>节点中确定。这是必要的以便于服务端知道在SSL握手中使用哪个证书和密钥。第三,服务端通过确定PeerTrust为certificationValidationMode配置去忽略验证客户端证书的路径。当与通过MakeCert.exe生成的证书一起工作时这是必须的,而不是获取的真实证书或者从一个可信赖组织生成的。

列表8.9 使用NetTcpBinding的证书认证

<?xml version="1.0" encoding="utf-8" ?>
<configuration><system.serviceModel><bindings><netTcpBinding><binding name="MyBinding"><security><transport clientCredentialType="Certificate"><extendedProtectionPolicy policyEnforcement="Never" /></transport><message clientCredentialType="None" /></security></binding></netTcpBinding></bindings><behaviors><serviceBehaviors><behavior name="metadata"><serviceMetadata httpGetEnabled="true" /></behavior><behavior name="NewBehavior"><serviceCredentials><clientCertificate><authentication certificateValidationMode="PeerTrust" /></clientCertificate><serviceCertificate findValue="localhost" x509FindType="FindBySubjectName" /></serviceCredentials></behavior></serviceBehaviors></behaviors><services><service behaviorConfiguration="metadata" name="EssentialWCF.EmployeeInformation"><endpoint address="" binding="netTcpBinding" bindingConfiguration="MyBinding"contract="EssentialWCF.IEmployeeInformation" /><endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""contract="IMetadataExchange" /><host><baseAddresses><add baseAddress="http://localhost:8000/EffectiveWCF" /><add baseAddress="net.tcp://localhost:8001/EffectiveWCF" /></baseAddresses></host></service></services></system.serviceModel>
</configuration>

为了在客户端和服务端之间初始化通信,客户端必须确定一个用来认证的证书。这可以在配置文件中或者代码中完成。列表8.10显示了为在认证中使用的服务附加一个证书到信道的客户端代码。在对等信赖下,服务将在它的可信赖人文件夹中寻找证书。如果找到了,访问将会被允许;如果找不到,访问将会被拒绝。

列表8.10 证书认证的客户端代码

Employee employee = new Employee(358, "Daniel", "Dong", "210");EmployeeInformationClient proxy = new EmployeeInformationClient();proxy.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.PeerTrust;proxy.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "MyClientCert");try{Employee e = proxy.UpdateEmployee(employee);Console.WriteLine("Name is: {0}", e.FirstName);}catch (Exception ex){Console.WriteLine(ex.Message);}

转载于:https://www.cnblogs.com/danielWise/archive/2011/01/11/1933206.html

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

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

相关文章

前端学习(205):animation动画库

动画库 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible" conte…

【OS学习笔记】四十 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务二代码

本文是以下几篇文章对应的微型动态加载的用户程序/任务二代码&#xff1a; 【OS学习笔记】三十四 保护模式十&#xff1a;中断和异常区别【OS学习笔记】三十五 保护模式十&#xff1a;中断描述符表、中断门和陷阱门【OS学习笔记】三十六 保护模式十&#xff1a;通过中断发起任…

JS调用后台方法大全

javascript函数中执行C#代码中的函数&#xff1a;方法一&#xff1a; 1、首先建立一个按钮&#xff0c;在后台将调用或处理的内容写入button_click中;    2、在前台写一个js函数&#xff0c;内容为document.getElementById("btn1").click();    3、在前台或后…

【OS修炼指南目录】----《X86汇编语言-从实模式到保护模式》读书笔记目录表

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff1a; 780902027 本文是将个人的关于《X86汇编语言-从实模式…

C语言编译全过程剖析

内容摘要 C语言编译的整个过程是非常复杂的&#xff0c;里面涉及到的编译器知识、硬件知识、工具链知识都是非常多的&#xff0c;深入了解整个编译过程对工程师理解应用程序的编写是有很大帮助的&#xff0c;希望大家可以多了解一些&#xff0c;在遇到问题时多思考、多实践。 一…

【剑指offer - C++/Java】7、斐波那契数列

在线题目链接&#xff1a;斐波那契数列 文章目录1、题目描述2、题目分析3、代码3.1 递归方法3.11 Java代码3.12 C代码3.2 动态规划3.21 Java代码3.22 C代码3.3 循环方法3.31 Java代码3.32 C代码4、总结1、题目描述 大家都知道斐波那契数列&#xff0c;现在要求输入一个整数n&a…

母版事件中注册javascript脚本

母版事件中注册javascript脚本 ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ Title :㈠母版等事件中注册javascript脚本 Description: version : 1.0 Date :8:46 2008-3-26 Author : Tia…

【剑指offer - C++/Java】8、跳台阶

在线题目链接&#xff1a;跳台阶 文章目录1、题目描述2、题目分析3、代码3.1 递归方法3.11 Java代码3.12 C代码3.2 动态规划3.21 Java代码3.22 C代码3.3 循环方法3.31 Java代码3.32 C代码4、总结1、题目描述 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青蛙跳…

【剑指offer - C++/Java】9、变态跳台阶

题目链接&#xff1a;变态跳台阶 文章目录1 题目描述2 题目分析3 代码3.1 动态规划算法3.11 Java代码3.12 C代码3.2 递归算法3.21 Java代码3.22 C代码3.3 直接求解 公式&#xff1a;f(n)2^(n-1)^3.31 Java代码3.32 C代码4 总结1 题目描述 一只青蛙一次可以跳上1级台阶&#xf…

在Linux上构建ASP.NET环境-asp.net关注

在Linux上安装mono,xsp,mod_mono后&#xff0c;可以构建一个ASP.NET环境&#xff0c;Mono项目是由Novell支持的。mono官网地址&#xff1a;mono下载页面&#xff1a;/mono-downloads/download.htmlXSP是一个轻量级的Web服务器&#xff0c;它是用100%的C#代码写成的纯.Net应用程…

【剑指offer - C++/Java】10、矩形覆盖

在线题目链接&#xff1a;矩形覆盖 文章目录1 题目描述2 题目分析3 代码3.1 递归方法3.11 Java代码3.12 C代码3.2 动态规划算法3.2 动态规划3.21 Java代码3.22 C代码3.3 循环方法3.31 Java代码3.32 C代码4、总结1 题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形…

C++ primer 笔记(二)

第9章 sequential container 顺序容器: vector 快速随机访问 list快速插入删除 deque双端&#xff0c;随机访问 C<T> c; C c(c2); C c(b,e); //迭代器,数组,指针&#xff0c;不要求两个容器类型相同 C<T> c(n,t); //只适用与顺序容器 C<T> c(n…

【剑指offer - C++/Java】11、二进制中1的个数

在线题目链接&#xff1a;二进制中1的个数 文章目录1 题目描述2 题目分析2.1 方法12.11 Java代码2.12 C代码2.2 方法22.21 Java代码2.22 C代码3 总结1 题目描述 输入一个整数&#xff0c;输出该数二进制表示中1的个数。其中负数用补码表示。 2 题目分析 2.1 方法1 这道题看起…

IIS 启动不了(服务没有及时响应启动或控制请求)解决

以前用360时为了加快开机速度,经常禁用一些服务, 就是这样 Eventlog WorldWideWebPublishing Remote Procedure Call IIS Admin Service 把这些服务都启动了就能启动iis网站了转载于:https://www.cnblogs.com/x4646/articles/1948780.html

【剑指offer - C++/Java】12、数值的整数次方

在线题目链接&#xff1a;数值的整数次方 文章目录1 题目描述2 题目分析2.1 方法1 循环2.11 Java代码2.12 C代码2.2 方法2 递归2.21 Java代码2.22 C代码3 总结1 题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 2 题目分析 2.1 方…

ASP.NET四种页面导航方式之比较与选择

在ASP.NET应用中&#xff0c;Web表单之间的导航有多种方式&#xff1a;用超级链接&#xff0c;用Response.Redirect&#xff0c;用Server.Transfer&#xff0c;或者用Server.Execute。本文将分析这四种导航方式的异同及其优缺点&#xff0c;帮助你选择最佳的导航方式。 一、超级…

【剑指offer - C++/Java】13、调整数组顺序使奇数位于偶数前面

在线题目链接&#xff1a;调整数组顺序使奇数位于偶数前面 文章目录1 题目描述2 题目分析2.1 方法12.11 Java代码2.12 C代码2.2 方法22.21 Java代码2.22 C代码3 总结1 题目描述 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有的奇数位…

Camparable与Comparator之区别

一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的&#xff0c;这个类对象组成的集合就可以直接使用sort方法排序。 Comparator可以看成一种算法的实现&#xff0c;将算法和数据分离&#xff0c;Comparator也可以在下面两种环境下使用&#xff1a; 1、类的设计…

【剑指offer - C++/Java】14、链表中倒数第k的节点

在线题目链接&#xff1a;链表中倒数第k的节点 文章目录1 题目描述2 题目分析2.1 Java代码2.2 C代码3 总结1 题目描述 输入一个链表&#xff0c;输出该链表中倒数第k个结点。 2 题目分析 这道题比较简单。常规做法是先求出链表的总的节点个数n&#xff0c;然后再从头开始找第n-…

beta:scrum5

今天的工作 周一的工作 困难 王佳磊 收集数据&#xff0c;build了online的数据库, 38934 38939&#xff0c;收集更多数据&#xff0c;在新的API环境下&#xff0c;逐步发现并fix掉以前姓名到ID映射的bug. API的改动&#xff0c;ID的合并 肖巍&#xff0c;兰翠玲 等待测…