三川BBS's Archiver

二十郎 发表于 2007-10-16 16:39

Web Services Enhancements 3.0 Quick Start(三)

上两章主要是说明了利用Web Services Enhancements 3.0创建安全策略.现在主要是通过一个示例来较完整的讲述Web Services Enhancements 3.0构建安全Web Services        在 June CTP 中共有六种交钥匙声明第一种是 AnonymousOverCertificateSecurity,其中 Web 服务通过其 X.509 证书对其本身进行到调用者的验证。所有调用者均是匿名的。通过使用服务器公钥交换的对称密钥提供消息级的完整性和保密性。在逻辑上,此模型与您访问喜欢的网上书店并购买某本书时所发生的情况类似。书店的客户太多了,不可能对每个客户逐一验证,但接受信用卡号和帐单接收地址是很好的方法,这样这笔交易的验证责任就转给银行了。在许多企业对企业的 Web 服务情况中,客户机和服务器都分配有证书。这种情况下,您可以从以下两种声明选择一种:CertificateMutualAuthenticationProfile 或 MutualCertificateSecurity。它们在逻辑上非常相似,客户机和服务器通过彼此出示 X.509 证书进行验证,并证明相应私钥的所有权。通过使用服务器公钥交换的对称密钥提供消息级的完整性和保密性。第一种声明依赖于现有的 WS-Security 1.0 规范,而第二种则使用 WS-Security 1.1 规范草案,其中包括一些新增功能(例如加密的 SOAP 标头)。虽然使用证书对客户机进行验证是个不错的选择,通常这样做简单但却不可行,因为这增加了维护(发放和管理客户机证书所必需的)公钥基础结构 (PKI) 的开销。通常,通过简单的用户名和密码对客户机进行验证更加合理。以下是支持此类验证的两种交钥匙声明:UsernameOverTransportSecurity 和 UsernameOverCertificateSecurity。如果要依赖 SSL 验证服务器并为通道提供完整性和保密性,则应当使用 UsernameOverTransportSecurity。而当 SSL 不适用时(例如,当有中间方并且要进行端对端验证时),UsernameOverCertificateSecurity 则十分有用。最后,如果要为支持 Kerberos 的 intranet 构建 Web 服务(现代 Windows® 域环境中的情况),KerberosSecurity 声明是非常合适的选择。由于 Kerberos 使用纯传统的加密方法来验证客户机和服务,因此与基于证书的解决方案相比,它不会为服务带来那么大的负担。但迄今为止 Windows 域环境的最大好处是支持单一登录。通过使用客户机的默认登录凭据进行验证,无需查询客户机密码。当然也不需要 PKI。服务器可以使用 Windows 组作为角色为资源访问授权或者只是模拟客户机,并让 Windows 处理访问检查。(转自http://www.microsoft.com/china/MSDN/library/WebServices/WebServices/issues0602WSE30.mspx?mfr=true)         我们现在主要是通过usernameForCertificateSecurity作为示例首先要介绍两个工具软件makecert.exe和certmgr.exemakecert.exe是证书创建工具生成仅用于测试目的的 X.509 证书。它创建用于数字签名的公钥和私钥对,并将其存储在证书文件中。此工具还将密钥对与指定发行者的名称相关联,并创建一个 X.509 证书,该证书将用户指定的名称绑定到密钥对的公共部分。(http://msdn2.microsoft.com/zh-cn/library/bfsktky3.aspx详细介绍)certmgr.exe证书管理器工具管理证书、证书信任列表 (CTL) 和证书吊销列表 (CRL)。(http://msdn2.microsoft.com/zh-cn/library/e78byta0.aspx详细介绍)        现在我们就使用这两个工具来生成我们使用的工具makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%WSE2QuickStartServer% -sky exchange -pe    certmgr.exe -add -r LocalMachine -s My -c -n %WSE2QuickStartServer% -r CurrentUser -s AddressBook    makecert.exe -sr CurrentUser -ss My -a sha1 -n CN=%WSE2QuickStartClient% -sky exchange -pe         查看证书开始->运行。。。MMC文件->添加/删除管理单元->添加->证书->添加->计算机帐户->个人->证书->WSE2QuickStartServer文件->添加/删除管理单元->添加->证书->添加->当前用户->个人->证书->WSE2QuickStartClient文件->添加/删除管理单元->添加->证书->添加->当前用户->其他人->证书->WSE2QuickStartServer如图程序实现一、新建一个WebServie,并建立客户端需要包含用户名和密码的Usernametoken的安全令牌的安全策略(http://www.cnblogs.com/jiekeng/archive/2006/10/25/539962.html)信建一个类CustomUsernameTokenManager 继承自Microsoft.Web.Services3.Security.Tokens.UsernameTokenManagerusing System;using System.Xml;using System.Security.Permissions;using Microsoft.Web.Services3.Security;using Microsoft.Web.Services3.Security.Tokens;namespace Microsoft.Web.Services3.QuickStart{    public class CustomUsernameTokenManager : UsernameTokenManager    {        public CustomUsernameTokenManager()        {        }        public CustomUsernameTokenManager(XmlNodeList nodes)            : base(nodes)        {        }        protected override string AuthenticateToken( UsernameToken token )        {            byte[] password = System.Text.Encoding.UTF8.GetBytes( token.Username );            Array.Reverse( password );            return Convert.ToBase64String( password );        }    }} 建立一个web服务,返回一个字符串using System;using System.Collections.Generic;using System.Web;using System.Web.Services;using System.Web.Services.Protocols;using System.Xml.Serialization;using Microsoft.Web.Services3;using Microsoft.Web.Services3.QuickStart;[WebService(Namespace = "http://stockservice.contoso.com/wse/samples/2005/10")][WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)][Policy("ServerPolicy")]public class WSSecurityUsernameService : System.Web.Services.WebService{    public WSSecurityUsernameService()    {    }      public string helloWorld()    {        return "helloWorld"    }}二、新建一个控制台工程,设置WSE(http://www.cnblogs.com/jiekeng/archive/2006/10/26/541210.html(使用Username客户访问方式))添加服务引用,在代理类中大家看到public partial class WSSecurityUsernameServiceWse : Microsoft.Web.Services3.WebServicesClientProtocol,并不是System.Web.Services.Protocols.SoapHttpClientProtocolusing System;using System.Collections.Generic;using System.Text;using Microsoft.Web.Services3;using Microsoft.Web.Services3.Design;using Microsoft.Web.Services3.Security;using Microsoft.Web.Services3.Security.X509;using Microsoft.Web.Services3.Security.Tokens;using localhost;namespace WSSecurityUsernameClient{    class WSSecurityUsernameClient     {        static void Main(string[] args)        {            WSSecurityUsernameClient client = null;            try            {                client = new WSSecurityUsernameClient();                client.Run();            }            catch (Exception ex)            {            }            Console.WriteLine( "" );            Console.WriteLine("Press [Enter] to continue");            Console.ReadLine();        }        public void Run()        {            WSSecurityUsernameServiceWse serviceProxy = new WSSecurityUsernameServiceWse();            UsernameToken token = null;            bool useCorrectPassword = true;             string username = Environment.UserName;            byte[] passwordBytes = System.Text.Encoding.UTF8.GetBytes(username);            Array.Reverse(passwordBytes);            if (useCorrectPassword)            {                string passwordEquivalent = Convert.ToBase64String(passwordBytes);                token = new UsernameToken(username, passwordEquivalent);            }            else            {                token = new UsernameToken(username, "BadPassword");            }            serviceProxy.SetClientCredential(token);            serviceProxy.SetPolicy("ClientPolicy");            Console.WriteLine("Calling {0}", serviceProxy.Url);                Console.WriteLine("");                Console.WriteLine( "helloWorld: " + serviceProxy.helloWorld());        }    }}运行就能看到效果,总结我现在总有的疑惑的是客户端怎么安装证书的问题,如果有程序来安装,那BS程序就带来了部署上的问题,如果人工导入导出,那不是更郁闷,现在还在研究中,希望有人能多多帮忙啊

页: [1]
       

Powered by 三川BBS Archiver 6.1.0  © 2001-2007 本SEO插件由网络人站长论坛出品