网上这方面的资料比较少,自己琢磨了一阵子,再加上师兄的指导,现在总算能实现
Soap
消息的全部加密了,但是下一步,
Soap
消息的部分加密的实现,任重而道远,希望能和大家多多交流,共同提高。
5月31日小节
整个过程,我们要实现利用WSE 3.0 对服务进行加密,并保证能进行安全的传输。并且还兼有简单认证的功能。
1)建立数据库Tao1,并新建表Info_Table,
里面包括3列,ID,Text_Info,Data_Info
2)创建一个Web服务,功能,能够显示数据库的信息。
在其中需要添加代码:
因为在安装Sql数据库的时候,是按照windows模式安装的,因此,在服务器连接的时候是采用“sever=(local)/”的方式。
3)创建一个网站,里面包含一个Button和一个Gridview,点击Button可以返回数据库表。添加引用
using
System.Data.SqlClient; using Microsoft.Web.Services3;
并且添加Web引用,修改引用名字为:Tao1;
此时只需要添加代码:
TaoService1.Service service = new TaoService1.Service();
GridView1.DataSource = service.GetInfo();
GridView1.DataBind();
调试,运行成功。
4)在服务端添加类:
CustomUsernameTokenManager,具体代码如下:
using
System;
using
System.Xml;
using
Microsoft.Web.Services3.Security;
using
Microsoft.Web.Services3.Security.Tokens;
public
class CustomUsernameTokenManager : UsernameTokenManager
{
public CustomUsernameTokenManager()
{
//
// TODO: Add constructor logic here
//
}
public CustomUsernameTokenManager(XmlNodeList nodes)
: base(nodes)
{
}
protected override string AuthenticateToken(UsernameToken token)
{
return "1";
}
}
它所实现的是,允许访问服务的用户,只有密码为“1”的时候才可以进入。
接下来我们加入WSE3.0
5)首先需要导入证书,我们采用了WSE2.0所颁发的一个测试证书,在“开始——运行”输入mmc,出现“根控制台”,在“文件——添加/删除管理单元”处添加证书,建立两个分别存放在“当前用户”和“本地计算机中”,则是下面这种情况,如图:
注:之所以要在两个地方都导入证书,原因是:
在“本地计算机”上的证书存储:是Web服务使用,这个地方存储公钥。
在“当前用户”上的证书存储:是客户端使用,这个地方存储证书和私钥。
导入的时候先导入.Client Private.pfx 下一步之后,它会让输入密码,这时候,在readme.html中我们会找到密码,输入,则完成证书导入。然后再导入Public.cer,这个是客户端使用数字签名需求时候的公钥。最后在展开本地计算机的证书处,导入Sever Public.cer,这个将是服务端解密客户端的公钥。
6)在服务端导入证书
右键,点击WSE3.0 Settings,两个都选择
接下来,添加策略:
策略的名字为“a”
接下来选择“Secure a service application”和“Username”,然后,默认,默认,
在选择证书处,选择导入的 WSE2QuickStarServer
然后默认,确定。
在安全标签处:
此时,服务端的代码为:
using
System.Data.SqlClient;
using
Microsoft.Web.Services3;
…..//…….
[WebMethod]
public DataSet GetInfo()
{
//authorize();
SqlConnection connection = new SqlConnection
(@"server=(local)/;database=Tao1;Integrated Security=true");
SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT * FROM Info_Table", connection);
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet, "Info_Table");
connection.Close();
return dataSet;
}
同理,在客户端,我们同样的添加证书。
注意:在客户端和服务器端,我们使用的证书是一致的,本次实验中,我使用得是
WSE2QuickStarServer
证书。
这时,客户端的代码为:
using
TaoService1;
using
Microsoft.Web.Services3.Security.Tokens;
……
……
TaoService1.ServiceWse service = new TaoService1.ServiceWse();
UsernameToken usernameToken = new UsernameToken("admin1", "1", PasswordOption.SendPlainText);
service.SetClientCredential<UsernameToken>(usernameToken);
service.SetPolicy("a");
GridView1.DataSource = service.GetInfo();
GridView1.DataBind();
整个实验中,我们手动添加的有:
服务端的Web.config的<security>节点中,我们添加了
<securityTokenManager>
<add
type="StockTraderSecure.CustomUsernameTokenManager"namespace="http://docs.oasis-open.org/wss/2004/01/oasis- 200401-wss-wssecurity-secext-1.0.xsd"localName="UsernameToken" xmlns=""/>
</securityTokenManager>
服务端的 wse3policyCache.config中,添加了
在<policy> 节点中添加了:
<authorization>
<allow user="admin" />
<deny user="*" />
</authorization>
在<extension>节点中,添加了
<extension name="authorization"
type="Microsoft.Web.Services3.Design.AuthorizationAssertion,
Microsoft.Web.Services3,
Version=3.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35" />
全部添加好后,调试,运行,成功!
参考资料:《Aprèss expert service oriented architecture in c charp 2005,2nd》