• WebService 里的 SoapHeader 验证


    WebService 要来就是公平来的,如果有些方法不需要被别人使用,只允许通过特定许可的人使用,便可以用到 SoapHeader 验证。在 IssueVision 项目中就有用到。现在把一些东西记下来。

    首先,新建一个项目(WinForm或Asp.net),我建的叫Win5,再在解决方案中加入一个 WebService,假设名字叫 Service。

    在 WebService 中进行如下操作
    1.加入一个自定义的 SoapHeader类,MySoapHeader。如下:

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.Services;
    using System.Web.Services.Protocols;


    /**//// <summary>
    /// MySoapHeader 的摘要说明
    /// </summary>
    public class MySoapHeader:SoapHeader
    {
        
    private string m_username;
        
    private string m_password;

        
    public string Username
        {
            
    get
            {
                
    return m_username;
            }
            
    set
            {
                m_username 
    = value;
            }
        }

        
    public string Password
        {
            
    get
            {
                
    return m_password;
            }
            
    set
            {
                m_password 
    = value;
            }
        }

        
    public MySoapHeader()
        {
            
    //
            
    // TODO: 在此处添加构造函数逻辑
            
    //
        }
    }

    里面其实定义了Username,Password两个属性而已。

    接下来定义对SoapHeader进行验证的类,为了简便,只检查一下是不是为 admin 而已。

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.Services;
    using System.Web.Services.Protocols;

    /**//// <summary>
    /// HeaderCheck 的摘要说明
    /// </summary>
    public class HeaderCheck
    {
        
    public static void check(Service srv)
        {
            
    if (!( srv.MyHeader.Username=="admin" && srv.MyHeader.Password=="admin"))
            {
                
    throw new SoapException("Audit Fail", SoapException.ClientFaultCode, "Security");
            }
        }

        
    public HeaderCheck()
        {
            
    //
            
    // TODO: 在此处添加构造函数逻辑
            
    //
        }
    }

    里面的 check 是检查用的方法,Service 是 WebSerice 的类名 srv是其一个变量,这个变量要的格式在 .asmx.cs 中有定义,这个方法并没有返回任何值,他也不需要返回值,如果通过验证,就什么都不用管,如果不通过验证,也不返回假值,而是直接抛出一个异常(SoapException)。这样一来,如果通不过验证,就会出现异常,自然也就得不到结果。

    再来设计WebService 的主代码页,定义一个MySoapHeader 的属性用于验证。在每个 WebMethod 上加个 SoapHeader 这个标签,这样,就能得到客户端传来的 SoapHeader,在 WebMethod 里面,要用一个check方法来检查这个 SoapHeader 合法不。每个 WebMethod 都要,麻烦。

    using System;
    using System.Web;
    using System.Web.Services;
    using System.Web.Services.Protocols;

    [WebService(Namespace 
    = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo 
    = WsiProfiles.BasicProfile1_1)]
    public class Service : System.Web.Services.WebService
    {
        
    private MySoapHeader m_myheader;

        
    public MySoapHeader MyHeader
        {
            
    get
            {
                
    return m_myheader;
            }
            
    set
            {
                m_myheader 
    = value;
            }
        }

        
    public Service () {

            
    //如果使用设计的组件,请取消注释以下行 
            
    //InitializeComponent(); 
        }

        [WebMethod]
        
    public string HelloWorld() {
            
    return "Hello World";
        }

        [SoapHeader(
    "MyHeader")]
        [WebMethod(Description
    ="Plus Two Int")]
        
    public int Plus(int a, int b)
        {
            HeaderCheck.check(
    this);
            
    return a + b;
        }
        
    }
    在这段代码中, HelloWorld 是可以任何调用的,而 Plus  就需要加入 SoapHeader 传进来,否则就会报错,得不到结果。

    OK,WebService 告一段落,生成一下。下面是客户端,我用的是WinForms

    将上面的 WebSerice 引用下来,叫做 localhost ,然后代码如下调用

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace Win5
    {
        
    public partial class Form1 : Form
        {
            
    public Form1()
            {
                InitializeComponent();
            }

            
    private void Form1_Load(object sender, EventArgs e)
            {
                Win5.localhost.Service ws 
    = new Win5.localhost.Service();
                Win5.localhost.MySoapHeader header 
    = new Win5.localhost.MySoapHeader(); 
                header.Username 
    = "admin";
                header.Password 
    = "adin";
                ws.MySoapHeaderValue 
    = header;  //多了一个"value"
                int r = ws.Plus(12);
                MessageBox.Show(r.ToString());
            }
        }
    }

    至此,全部完成。以后每种方法调用的时候,只要是 ws 的,都会加上 header 头,进行验证。客户端倒是省事,只要设置一次 SoapHeader 头,而服务端,将每个 WebMethod 都要验证一次 SoapHeader 头是否合法。

    完成。。。

  • 相关阅读:
    JID 2.0 RC4 发布,高性能的 Java 序列化库
    FBReaderJ 1.6.3 发布,Android 电子书阅读器
    Arquillian 1.0.3.Final 发布,单元测试框架
    JavaScript 的宏扩展 Sweet.js
    Hypertable 0.9.6.5 发布,分布式数据库
    JRuby 1.7.0 发布,默认使用 Ruby 1.9 模式
    httppp 1.4.0 发布,HTTP响应时间监控
    Redis 2.6.0 正式版发布,高性能K/V服务器
    OfficeFloor 2.5.0 发布,IoC 框架
    XWiki 4.3 首个里程碑发布
  • 原文地址:https://www.cnblogs.com/Fooo/p/1524876.html
Copyright © 2020-2023  润新知