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.exe
makecert.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.UsernameTokenManager


using 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.SoapHttpClientProtocol


using 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程序就带来了部署上的问题,如果人工导入导出,那不是更郁闷,现在还在研究中,希望有人能多多帮忙啊
在 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.exe
makecert.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详细介绍)
现在我们就使用这两个工具来生成我们使用的工具

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.UsernameTokenManager



























































二、新建一个控制台工程,设置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.SoapHttpClientProtocol

































































总结
我现在总有的疑惑的是客户端怎么安装证书的问题,如果有程序来安装,那BS程序就带来了部署上的问题,如果人工导入导出,那不是更郁闷,现在还在研究中,希望有人能多多帮忙啊
posted on 2006-10-31 22:21 jiekengxu 阅读(3708) 评论(1) 编辑 收藏 举报