使用SOAP 标头提高Web 服务安全性

默认情况下,只要知道一个Web 服务的地址,我们就可以随意调用他,今天我们通过在SOAP 标头添加对调用Web 服务用户身份的验证,进而提高Web 服务安全性。

在Web 服务中接收和处理 SOAP 标头的基本步骤:

·创建一个从 SoapHeader 派生的类,表示传入 SOAP 标头的数据。
·将一个成员添加到实现 XML Web services 的类或 XML Web services 客户端代理类(它们属于在第一步创建的类型)。
·指定第二步中在 MemberName 属性中创建的成员,将 SoapHeaderAttribute 应用于 XML Web services 方法或代理类中的对应方法。
·在 XML Web services 方法或 XML Web services 客户端代码中访问 MemberName 属性,以处理在 SOAP 标头中发送的数据。

示例

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

/// <summary>
/// SoapHeader 派生类
/// </summary>
public class MySoapHeader : SoapHeader
{
    //用户名
    private string _userName;
    public string UserName
    {
        get { return _userName; }
        set { _userName = value; }
    }

    //密码
    private string _userPass;
    public string UserPass
    {
        get { return _userPass; }
        set { _userPass = value; }
    }

    //检测权限
    public bool Check()
    {
        if (UserName == "admin" && UserPass == "admin888")
            return true;
        else
            return false;
    }
}

[WebService(Namespace = "http://www.mzwu.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
    //MySoapHeader类型属性
    private MySoapHeader _soap;
    public MySoapHeader Soap
    {
        get { return _soap; }
        set { _soap = value; }
    }

    public Service () {

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

    [WebMethod(Description="Web 服务身份验证示例")]
    [SoapHeader("Soap", Direction = SoapHeaderDirection.InOut)]
    public string Hello(string name) {
        if (!Soap.Check())
            return "身份验证不通过!";

        return "Hello," + name;
    }
    
}

调用示例:

WS.MySoapHeader soap = new WS.MySoapHeader();
soap.UserName = "admin";
soap.UserPass = "admin888";

WS.Service service1 = new WS.Service();
service1.MySoapHeaderValue = soap;

Response.Write(service1.Hello("Jack"));

参考文章

SoapHeader 类:http://msdn.microsoft.com/zh-cn/library/system.web.services.protocols.soapheader.aspx

评论: 0 | 引用: 0 | 查看次数: 3357
发表评论
登录后再发表评论!