编写一个使用WS-Security的WebMethod
2006-06-13 14:54
375 查看
现在我们需要创建一个使用WS-Security的WebMethod。 这里,我实现了一个简单的方法,它运行Northwind数据库的CustOrderHist存储过程,接收一个字串UserID作为唯一的参数,并返回一个DataSet。如果调用Web服务的客户端可以通过消息级UsernameToken验证,那么就可以取回DataSet。如果不能通过验证的话,客户端将得到一个异常,告知它不能通过验证。WSE的优点在于你只要付出一点点劳动就可以了,大部分的工作已经由WSE在暗中为你完成了,所以你可以把大部分时间花费在构建Web服务的内容上,而不是为了构建一个安全的Web服务机制而疲于奔命。
[WebMethod]
public DataSet CustOrderHist(string CustId)
{
// 只接受 SOAP格式的请求
SoapContext requestContext = HttpSoapContext.RequestContext;
if(requestContext==null)
{
throw new ApplicationException("Non-SOAP request!");
}
bool valid=false;
try
{
foreach(SecurityToken tkn in requestContext.Security.Tokens)
{
if(tkn is UsernameToken)
valid=true;
}
}
catch(Exception ex)
{
throw new Exception( ex.Message + ": " + ex.InnerException.Message);
}
if (valid==false)
throw new ApplicationException("Invalid or Missing Security Token.");
SqlConnection cn;
SqlDataAdapter da;
DataSet ds;
cn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["SqlConn"].ToString());
cn.Open();
da = new SqlDataAdapter("custorderHist '" +CustId + "'", cn);
ds = new DataSet();
da.Fill(ds, "CustOrderHist");
return ds;
}
使用上面的WebMethod,我们就可在服务器上实现验证用户名/密码的操作。WebMethod必须引用Microsoft.Web.Services和Microsoft.Web.Services.Security域名空间。现在,我们要构建一个ASP.NET客户端,这个客户端能够发送验证所需的SOAP头,并可调用我们的Web服务方法。
构建WSE ASP.NET客户端
对于客户端,WSE提供了继承于System.Web.Services.Protocols.SoapHttpClientProtocol类的Microsoft.Web.Services.WebServicesClientProtocol类。当你在Visual Studio.NET中选择“Add Web Reference”选项的时候,或者使用WSDL.exe程序创建基于WSDL的客户端代码时,你需要使用SoapHttpClientProtocol类。你可做的就是使用Visual Studio.NET中的“Add Web Reference”选项或者WSDL.exe程序为你的客户端生成代理类,然后把代理类从继承于SoapHttpClientProtocol改为继承于WebServicesClientProtocol。这样代理类就有了RequestSoapContext和ResponseSoapContext属性,你可以使用它们访问你发送或接收的WS-Security头。在C#工程中,如果你已经使用了“Add Web Reference”选项,你可以点击Solution Explorer中的“Show All Files”按钮,点击这个按钮就可在Solution Explorer的Web References结点中显示Reference.cs文件,让你可以编辑这个文件。
为了创建正确的UsernameToken和在消息级调用Web服务的代理方法,需要使用下面的代码:
我们要做的就是从客户端的两个文本输入框txtUsername和txtPassword中取得输入字串,然后使用PasswordOption.SendHashed把它们结合起来创建一个有效的UserNameToken。当调用Web服务时,WSE SOAP扩展验证请求的一般格式,然后核对密码散列并从我们的PasswordProvider方法中取得的密码。如果两者匹配,我们就可调用Web服务方法,客户端返回数据集,显示在一个网格中。
我们现在已经创建了一个完整的使用WSE配合数据库验证SHA1摘要散列用户名/密码的Web服务,希望读者们能通过本文了解到使用WSE保证Web服务安全的基本措施和方法,并能在实际工作中合理的去应用。
在文章的最后,我们给出修改Northwind数据库Employees表的SQL脚本,给这个表添加了所需的username和password列,同时在这个表中插入了一条新纪录,其Firstname、Lastname、Username、Password和roles字段分别为“User”,“One”,“user1”,“pass1”和“user”。
[WebMethod]
public DataSet CustOrderHist(string CustId)
{
// 只接受 SOAP格式的请求
SoapContext requestContext = HttpSoapContext.RequestContext;
if(requestContext==null)
{
throw new ApplicationException("Non-SOAP request!");
}
bool valid=false;
try
{
foreach(SecurityToken tkn in requestContext.Security.Tokens)
{
if(tkn is UsernameToken)
valid=true;
}
}
catch(Exception ex)
{
throw new Exception( ex.Message + ": " + ex.InnerException.Message);
}
if (valid==false)
throw new ApplicationException("Invalid or Missing Security Token.");
SqlConnection cn;
SqlDataAdapter da;
DataSet ds;
cn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["SqlConn"].ToString());
cn.Open();
da = new SqlDataAdapter("custorderHist '" +CustId + "'", cn);
ds = new DataSet();
da.Fill(ds, "CustOrderHist");
return ds;
}
使用上面的WebMethod,我们就可在服务器上实现验证用户名/密码的操作。WebMethod必须引用Microsoft.Web.Services和Microsoft.Web.Services.Security域名空间。现在,我们要构建一个ASP.NET客户端,这个客户端能够发送验证所需的SOAP头,并可调用我们的Web服务方法。
构建WSE ASP.NET客户端
对于客户端,WSE提供了继承于System.Web.Services.Protocols.SoapHttpClientProtocol类的Microsoft.Web.Services.WebServicesClientProtocol类。当你在Visual Studio.NET中选择“Add Web Reference”选项的时候,或者使用WSDL.exe程序创建基于WSDL的客户端代码时,你需要使用SoapHttpClientProtocol类。你可做的就是使用Visual Studio.NET中的“Add Web Reference”选项或者WSDL.exe程序为你的客户端生成代理类,然后把代理类从继承于SoapHttpClientProtocol改为继承于WebServicesClientProtocol。这样代理类就有了RequestSoapContext和ResponseSoapContext属性,你可以使用它们访问你发送或接收的WS-Security头。在C#工程中,如果你已经使用了“Add Web Reference”选项,你可以点击Solution Explorer中的“Show All Files”按钮,点击这个按钮就可在Solution Explorer的Web References结点中显示Reference.cs文件,让你可以编辑这个文件。
为了创建正确的UsernameToken和在消息级调用Web服务的代理方法,需要使用下面的代码:
private void Button1_Click(object sender, System.EventArgs e) { localhost.SecurityServiceWse wse=new localhost.SecurityServiceWse(); UsernameToken tkn = new UsernameToken(txtUsername.Text,txtPassword.Text,PasswordOption.SendHashed); wse.RequestSoapContext.Security.Tokens.Add (tkn); try { DataSet ds=wse.CustOrderHist(txtCustID.Text); DataGrid1.DataSource=ds; DataGrid1.DataBind(); } catch(Exception ex) { DataGrid1.Visible=false; lblMessages.Text=ex.Message; } } |
我们现在已经创建了一个完整的使用WSE配合数据库验证SHA1摘要散列用户名/密码的Web服务,希望读者们能通过本文了解到使用WSE保证Web服务安全的基本措施和方法,并能在实际工作中合理的去应用。
在文章的最后,我们给出修改Northwind数据库Employees表的SQL脚本,给这个表添加了所需的username和password列,同时在这个表中插入了一条新纪录,其Firstname、Lastname、Username、Password和roles字段分别为“User”,“One”,“user1”,“pass1”和“user”。
USE NORTHWIND GO ALTER TABLE [dbo].[Employees] ADD [Username] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [Password] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [roles] [varchar] (250) COLLATE SQL_Latin1_General_CP1_CI_AS NULL GO INSERT INTO EMPLOYEES (Firstname, Lastname,Username, [Password], roles) VALUES('User','One', 'user1', 'pass1', 'user') GO |
相关文章推荐
- 编写一个使用WS-Security的WebMethod
- CXF 入门:创建一个基于WS-Security标准的安全验证(CXF回调函数使用,)
- CXF 入门:创建一个基于WS-Security标准的安全验证(CXF回调函数使用)(转)
- 使用WS-Security框架对信息进行加密与身份认证
- 2004.7.15 [C#学习记录]使用C#编写一个自定义控件
- 使用Python编写一个简单的tic-tac-toe游戏的教程
- 如何使用wxWidgets跨平台界面库来编写一个对话框窗口?
- 使用C#来编写一个异步的Socket服务器
- Delphi编写自定义控件以及接口的使用(做了一个TpgDbEdit)
- 使用libevent和boost编写一个简单的tcp服务器
- 使用html+css+js技术编写一个完整的表格列表内容中 复选框的全选 反选效果
- 编写一个程序,将两个字符串s1和s2比较,如果s1 > s2,输出一个正数;s1 = s2,输出0,;s1 < s2输出一个负数。不要使用strcmp函数。
- CXF 入门:创建一个基于WS-Security标准的安全验证
- 编写一个简单的计算器使用图形用户界面
- 使用PL SQL 编写一个逗号分割字符串分割处理函数
- 使用 Lua 编写一个 Nginx 认证模块 - 技术翻译 - 开源中国社区
- java 编写程序实现从控制台接收一个 5 位以上的整数,使用数组来判断该数字 * 是否是回文数。(例如:789987,12344321是回文数)
- odoo10使用继承的方式编写一个培训管理模块
- 使用C++与SFML编写一个简单的撞球游戏Part8——添加AI弹板
- java学习笔记之使用MyEclipse编写一个简单的登陆界(一)