zoukankan      html  css  js  c++  java
  • WebService基于SoapHeader实现安全认证(一)

    本文转载:http://www.cnblogs.com/houleixx/archive/2009/08/22/webservice-soapheader-security.html

    WebService基于SoapHeader实现安全认证 

          本文仅提供通过设置SoapHeader来控制非法用户对WebService的调用,如果是WebService建议使用WSE3.0来保护Web服务,如果使用的是Viaual Studio 2008可以使用WCF,WCF里面提供了更多的服务认证方法。以下提供一种基于SoapHeader的自定义验证方式。

    1.首先要自定义SoapHeader,须继承System.Web.Services.Protocols.SoapHeader

    using System;
    using System.Collections.Generic;
    using System.Web;
    
    /// <summary>
    ///自定义的SoapHeader
    /// </summary>
    public class MySoapHeader : System.Web.Services.Protocols.SoapHeader
    {
    
        private string userName=string.Empty;
        private string passWord=string.Empty;
    
        /// <summary>
        /// 构造函数
        /// </summary>
        public MySoapHeader()
        {
    
        }
    
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="userName">用户名</param>
        /// <param name="passWord">密码</param>
        public MySoapHeader(string userName, string passWord)
        {
            this.userName = userName;
            this.passWord = passWord;
        }
    
        /// <summary>
        /// 获取或设置用户用户名
        /// </summary>
        public string UserName
        {
            get { return userName; }
            set { userName = value; }
    
        }
    
        /// <summary>
        /// 获取或设置用户密码
        /// </summary>
        public string PassWord
        {
            get { return passWord; }
            set { passWord = value; }
        }
    }
    

    2.添加WebService,并编写相应代码。

    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.Services;
    
    /// <summary>
    ///WebService 的摘要说明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class WebService : System.Web.Services.WebService
    {
    
        //声明Soap头实例
        public MySoapHeader myHeader=new MySoapHeader();
     
        [System.Web.Services.Protocols.SoapHeader("myHeader")]
        [WebMethod]
        public string HelloWord()
        {
            //可以通过存储在数据库中的用户与密码来验证
            if (myHeader.UserName.Equals("houlei")&myHeader.PassWord.Equals("houlei"))
            {
                return "调用服务成功!";
            }
            else
            {
                return "对不起,您没有权限调用此服务!";
            }
        }   
    }
    3.客户端调用,分别使用不设置SoapHeader与设置SoapHeader。
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace App
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                localhost.WebService service = new localhost.WebService();
    
                //没有设置SoapHeader的服务调用
                  Console.WriteLine("没有设置SoapHeader:" + service.HelloWord());
                Console.WriteLine();
    
                //将用户名与密码存入SoapHeader;
                localhost.MySoapHeader header = new localhost.MySoapHeader();
                header.UserName = "houlei";
                header.PassWord = "houlei";
                service.MySoapHeaderValue = header;
    
                //设置SoapHeader的服务调用
                  Console.WriteLine("设置SoapHeader:" + service.HelloWord());
                Console.Read();
            }
        }
    }
    

    4.运行应用程序,查看运行结果。

    image

    再看一下直接通过浏览器的调用结果。

    image

    点击HelloWord调用Web服务,结果如下:

    image

    点击“调用”按钮,得到从服务器返回调用结果。

    image

          添加自定义SoapHeader可以成功调用WebService,否则不能调用WebService,从而实现对Web Service的非法调用。这种方法存在一定的弊端,就是在每一个WebService方法上都要进行一下验证,如果用户名与密码存储在数据库中,每调用一次WebService都要访问一次数据库进行用户名与密码的验证,对于频繁调用WebService来说,数据库压力很大。然而少量WebService调用这种方式还是一种不错的选择。

    (作者:侯垒
  • 相关阅读:
    Thinking in Java Reading Note(9.接口)
    Thinking in java Reading Note(8.多态)
    Thinking in Java Reading Note(7.复用类)
    SQL必知必会
    Thinking in Java Reading Note(5.初始化与清理)
    Thinking in Java Reading Note(2.一切都是对象)
    鸟哥的Linux私房菜笔记(1.基础)
    Thinking in Java Reading Note(1.对象导论)
    CoreJava2 Reading Note(2:I/O)
    CoreJava2 Reading Note(1:Stream)
  • 原文地址:https://www.cnblogs.com/51net/p/3148960.html
Copyright © 2011-2022 走看看