编写一个使用WS-Security的WebMethod

原创 2006年06月13日 14:54:00

现在我们需要创建一个使用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服务的代理方法,需要使用下面的代码:

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;
 }
}

  我们要做的就是从客户端的两个文本输入框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”。

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

CXF 入门:创建一个基于WS-Security标准的安全验证

CXF 入门:创建一个基于WS-Security标准的安全验证 http://www.blogjava.net/zljpp/archive/2012/04/15/374371.html ...

CXF使用WSS4J实现WS-Security规范之使用用户名令牌

CXF使用WSS4J实现WS-Security规范之使用用户名令牌 这个示例是一个简单的UsernameToken,它仅仅包装明文用户名和密码. pom.xml...

php使用WS-Security调用java接口

因为项目要做为第三方应用接入其他平台,需要调用对方的java获取数据,于是对方给出web service接口文档,我方调用。 对方考虑到安全因素,需要WS的客户端在调用服务的时候,请求头需要包含一...

webservice使用JDK自带的jax-ws创建并发布一个简单的webservice

JDK自带的jax-ws创建并发布一个简单的webservice
  • zy_js
  • zy_js
  • 2017年02月19日 11:19
  • 284

从 iOS,Objective-C, IPhone, iPad, Android, Java, Node.js 或其他平台,或通过其他开发语言,使用WS-Trust请求一个ADFS的令牌

从 iOS,Objective-C, IPhone, iPad, Android, Java, Node.js 或其他平台,或通过其他开发语言,使用WS-Trust请求一个ADFS的令牌 ...

Axis2+Rampart(WSS4J)实现UsernameToken认证方式的WS-Security(基于SOAP的Web安全调用机制)

最近在研究基于SOAP的Web安全调用机制,发现相关文章多但是都很不全,这里把Axis2+Rampart(WSS4J)实现UsernameToken认证方式的WS-Security的过程做个记录,供大...

基于SOAP的Web安全调用机制-----Axis2+Rampart(WSS4J)实现UsernameToken认证方式的WS-Security【未试验】

文章来源:http://blog.csdn.net/wwwgeyang777/article/details/19928631 最近一直研究SOAP消息的安全通信方式,没在网上搜到啥靠谱的,就...

jax-ws之webservice security(安全)教程第一天

前言: 在前面的“5天学会jaxws-webservice教程”,我们讲了基本的jax-ws的使用。 Jax-ws是业界公认的标准的webservice,它已经成为了一个行业界标准,包括c...
  • sqzhao
  • sqzhao
  • 2014年12月21日 14:09
  • 301

jax-ws之webservice security(安全)教程第二天

前言: 第一天里说了如何用jax-ws去结合ssh框架。 在今天的教程中将会向大家详细讲述一个ws-security中的一个传统的”基于handler”来认证客户端传来的用户名密码的webserv...

jax-ws之webservice security(安全)教程第一天

jax-ws之webservice security(安全)教程第一天              目录(?)[+] 前言jax-ws集成SSH框架 引入两个额外的jar包修改...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编写一个使用WS-Security的WebMethod
举报原因:
原因补充:

(最多只允许输入30个字)