利用SoapHeader验证web service调用的合法性(dwonmoon)

原创 2007年10月11日 11:42:00

本文主要通过示例介绍利用SoapHeader验证web service调用的合法性,
一建立Web service项目,新建一个APIService.asmx
其后台代码如下 

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.Services.Protocols;

namespace Downmoon.API
{
    
/// <summary>
    
/// GlobalSetting 的摘要说明
    
/// </summary>
    public class APIService : System.Web.Services.WebService
    {
        
public APIService()
        {
            
//SHeader = new SecuritySoapHeader();
        }
        
public class SecuritySoapHeader : SoapHeader
        {
            
#region Bak
            
private string _userName = string.Empty;
            
private string _pwd = string.Empty;
            
/**/
            
/// <summary>
            
/// 用户名
            
/// </summary>
            public string InvokeUserName
            {
                
get
                { 
return _userName; }
                
set
                { _userName 
= value; }
            }
            
/**/
            
/// <summary>
            
/// 密码
            
/// </summary>
            public string InvokeUserPwd
            {
                
get
                { 
return _pwd; }
                
set
                { _pwd 
= value; }
            }
            
#endregion
        }
        
#region Members
        
public SecuritySoapHeader SHeader = new SecuritySoapHeader();
        
private string _userName = string.Empty;
        
private string _pwd = string.Empty;
        
public string InvokeUserName
        {
            
get
            { 
return _userName; }
            
set
            { _userName 
= value; }
        }
        
public string InvokeUserPwd
        {
            
get
            { 
return _pwd; }
            
set
            { _pwd 
= value; }
        }
        
public static string SecurityUserID
        {
            
get
            {
                
try
                {
                    
return System.Configuration.ConfigurationManager.AppSettings["SecurityUserID"].ToString().Trim();
                }
                
catch
                {
                    
return "欢迎与邀月交流,net技术与软件架构";
                }
            }
        }
        
public static string SecurityUserPWD
        {
            
get
            {
                
try
                {
                    
return System.Configuration.ConfigurationManager.AppSettings["SecurityUserPWD"].ToString().Trim();
                }
                
catch
                {
                    
return "S2H3I4l5p6q7";
                }
            }
        }

        
#endregion
        
#region  Methods
        
#region CheckHeader
        
public bool IsLegalInvoked()
        {
            
return IsLegalInvoked(this.SHeader);
        }
        
public virtual bool IsLegalInvoked(SecuritySoapHeader header)
        {
            
bool bl = false;
            
if (header == null)
            {
                
//return "您没有设置SoapHeader,不能正常访问此服务!";
                return bl;
            }
            
else if (header.InvokeUserName == null || header.InvokeUserName.Trim().Length == 0 || header.InvokeUserPwd == null || header.InvokeUserPwd.Trim().Length == 0)
            { 
return bl; }
            
if (header.InvokeUserName.Trim() != SecurityUserID || header.InvokeUserPwd.Trim() != SecurityUserPWD)
            {
                
//return "您提供的身份验证信息有误,不能正常访问此服务!";
                return bl;
            }
            bl 
= true;
            
return bl;
        }
        
#endregion

        
#region ERRORHandle
        
private clsBasePage bp;
        
public void ErrorHandle(string strMessage)
        {
            
if (bp == null)
            {
                bp 
= new clsBasePage();

            }
            
else
            {
                bp.ErrorStop(strMessage);
                
return;
            }
        }

        
#endregion

        
#endregion

    }
}




二、添加一个PassPort.asmx,继承APIWebService,主要是为了重用SoapHeader,
调用方法如下(红色代码部分):

using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;
namespace Downmoon.API
{
    
/// <summary>
    
/// PassPort 的摘要说明 Downmoon Last Modified 
    
/// </summary>
    [WebService(Namespace = "欢迎与邀月交流,net技术与软件架构.API")]
    [WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
    
public class PassPort : APIService
    {
        
public PassPort()
        {
        }
        
        
#region Members
        
#endregion
        
#region  Methods

        
#region 测试安全信息
        [WebMethod(Description = "Test Safe Invoke", EnableSession = true, CacheDuration = 30),SoapHeader("SHeader")]       
        public string HelloWorld()
        {
            if(IsLegalInvoked())
            {
            return "Suceed!";
            }
            else{
                return "Illegal Invoke!";
            }
        }
        #endregion

        
#endregion
    }
}


三、建立Vs2005测试项目,并添加一个测试类(vs2005会自动生成,呵呵)
修改后代码如下:

// 以下代码由 Microsoft Visual Studio 2005 生成。
// 测试所有者应该检查每个测试的有效性。
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Text;
using System.Collections.Generic;
namespace TestAPI2005
{
    
/// <summary>
    
///这是 Downmoon.API.PassPort 的测试类,旨在
    
///包含所有 Downmoon.API.PassPort 单元测试
    
///</summary>
    [TestClass()]
    
public class PassPortTest
    {
        
       
private TestContext testContextInstance;

        
/// <summary>
        
///获取或设置测试上下文,上下文提供
        
///有关当前测试运行及其功能的信息。
        
///</summary>
        public TestContext TestContext
        {
            
get
            {
                
return testContextInstance;
            }
            
set
            {
                testContextInstance 
= value;
            }
        }

        
#region 附加测试属性
        
//编写测试时,可使用以下附加属性:
        #region InitTest
        
public static string invokeusername;
        
public static string invokeuserpwd;
        
public static string username;
        
public static string userIP;
        
public static string ConnKey;
        
public static string ConnValue;
        
public static int rowCount;
        
public static DateTime ldNow;
        
#endregion
        [ClassInitialize()]
        
public static void MyClassInitialize(TestContext testContext)
        {
            invokeusername 
= "欢迎与邀月交流,net技术与软件架构";
            invokeuserpwd 
= "S2H3I4l5p6q7";
            username 
= "欢迎与邀月交流,net技术与软件架构";
            userIP 
= "10.103.33.6";
            ConnKey 
= "";
            ConnValue 
= "";
            rowCount 
= 0;
            ldNow 
= DateTime.Now;
        }
        [ClassCleanup()]
        
public static void MyClassCleanup()
        {
            invokeusername 
= null;
            invokeuserpwd 
= null;
        }
        
//使用 TestInitialize 在运行每个测试前先运行代码
        
//[TestInitialize()]
        
//public void MyTestInitialize()
        
//{
        
//}
        
//使用 TestCleanup 在运行完每个测试后运行代码
        
//[TestCleanup()]
        
//public void MyTestCleanup()
        
//{
        
//}
        #endregion

        
#region HelloWorld () 的测试
        
/// <summary>
        
///HelloWorld () 的测试
        
///</summary>
        [TestMethod]
        
public void HelloWorldTest()
        {
            
try
            {
                TestAPI.PassPort.PassPort target 
= new TestAPI.PassPort.PassPort();
                target.SecuritySoapHeaderValue 
= new TestAPI.PassPort.SecuritySoapHeader();
                target.SecuritySoapHeaderValue.InvokeUserName 
= invokeusername;
                target.SecuritySoapHeaderValue.InvokeUserPwd 
= invokeuserpwd;
                
string str = target.HelloWorld();
                Console.WriteLine(str);
//Console.WriteLine("Result:" + str);
                Assert.AreEqual(str, "Suceed!"false);
            }
            
catch (Exception ex)
            {
                Assert.Fail(
"单元测试生成错误: "+ex.Message);
                
////Console.WriteLine(ex.Message);
            }
        }
        
#endregion
    }
}


四、在测试管理器中勾选该测试类

右键“运行选中的测试”,即可看到运行结果:通过!
标准输出 Suceed!
此时如果在浏览器中直接调用该服务,将会出现 “Illegal Invoke!”

OK! 结束

以上代码适用于.net 2.0及Vsts 2005。应该也可以适用于vs2003。

C#静态调用带有SoapHeader验证的WebServices

本文记录带有SoapHeader验证的WebServices服务创建、部署及C#中的静态调用方法,基于 Windows8.1、Visual Studio 2013、IIS8 环境实现。...
  • u012995964
  • u012995964
  • 2017年01月15日 22:39
  • 2234

webService访问加密-Soapheader

WebService head加密,可以对 WebService设置访问用户名和密码,增强 WebService的安全性 使 WebService只能被授权用户使用。 具体实现步骤: 1、 定义一个 ...
  • WanderOCN
  • WanderOCN
  • 2011年07月04日 17:58
  • 13916

在soapheader中添加自定义信息

有时候我们的webservice在服务端需要做一个调用方的验证,以保证我们的服务只有指定的客户才能使用。虽然可以使用wss4j的方法来做安全验证,但是考虑到我们的项目会与被.net平台下的项目调用,为...
  • cyf_cyf
  • cyf_cyf
  • 2012年01月11日 17:39
  • 9105

SOAP消息头的处理

SOAP消息头通常包含与消息体或SOAP处理(应用)方式相关的信息,比如消息路径、数字签名、认证信息,消息关联性信息、消息体的加密公匙等等。 下面我们以一个简单的权限认证的示例,来讲解如何添加和...
  • linjingj
  • linjingj
  • 2014年01月30日 10:10
  • 2981

用HttpPost登陆验证时,用户名和密码放在请求头部header中的处理方法,形式为Authorization: username password。

 post.setHeader("Authorization", "your token"); 这里主要是要
  • u013136708
  • u013136708
  • 2014年11月17日 15:57
  • 17428

Axis2+SOAP Header简单的验证方法实践

服务端 服务端就要在每个方法里面加上解析SOAP Header,并进行安全校验的代码即可,记住,是每一个方法里面都加,是everyone! 虽然是每一都需要添加校验代码,但庆幸的是,校验过...
  • zhangmeng_07
  • zhangmeng_07
  • 2017年01月24日 00:27
  • 517

SoapHeader 的作用是什么

SoapHeader  多数情况下用来传递用户身份验证信息,当然它的作用远不止如此,有待于在实际应用中发掘。当然也可以把用户名密码作为函数的参数传递给服务器端,但是这样没有单独的一个处理用户名密码的模...
  • bobwu
  • bobwu
  • 2011年11月22日 15:51
  • 4432

soapheader的创建和解析

  • 2012年12月19日 23:36
  • 55KB
  • 下载

关于 webservice 的SoapHeader 示例(赋值代码即可。)

SoapHeader是增强 webservice的安全性的。例如(支付、认证) 1,写一个web service发布了服务器上。 2,通过添加服务引用发布的webservice。 3,调用。 ...
  • wqs15192095633
  • wqs15192095633
  • 2015年10月08日 18:04
  • 1968

ASP.NET调用JAVA的CXF生成的Webservice,并带有Soapheader验证的解决方案

本文并不讲述怎么搭建CXF,网上相关资料比较多,不再赘述。 下面直接开始讲解在ASP.NET中怎么调用CXF生成的Webservice,并处理Soapheader验证。 1、 添加web引用 ...
  • lilinjian2001
  • lilinjian2001
  • 2015年11月13日 10:49
  • 2660
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用SoapHeader验证web service调用的合法性(dwonmoon)
举报原因:
原因补充:

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