要以安全的方式访问Web服务方法,可以考虑以下安全措施:
是谁调用?--SoapHeader身份认证。
来自哪里?--访问IP认证。
加密传输 --SSL安全访问。
这些安全保护措施常常是配合使用的。
7.9.1 通过SoapHeader来增强Web Service的安全性
通过SoapHeader我们可以让具有指定用户口令的用户来访问我们的Web服务接口。(完整代码示例位置:光盘/code/ch07/WebAppClient/WebForm-SoapHeader.aspx)
1.Web Service实现步骤
首先引入命名空间
- using System;
- using System.Collections;
- using System.ComponentModel;
- using System.Data;
- using System.Diagnostics;
- using System.Web;
- using System.Web.Services;
- using System.Web.Services.Protocols; //对soap Head引用添加的命名空间
(1)定义自己的SoapHeader派生类。
- public class MyHeader : System.Web.Services.Protocols.SoapHeader
- {
- private string _UserID = string.Empty;
- private string _PassWord = string.Empty;
- /// <summary>
- /// 构造函数
- /// </summary>
- public MyHeader()
- {
- }
- /// <summary>
- /// 构造函数
- /// </summary>
- /// <param name="nUserID">用户ID</param>
- /// <param name="nPassWord">加密后的密码</param>
- public MyHeader(string nUserID, string nPassWord)
- {
- Initial(nUserID, nPassWord);
- }
- #region 属性
- /// <summary>
- /// 用户名
- /// </summary>
- public string UserID
- {
- get { return _UserID; }
- set { _UserID = value; }
- }
- /// <summary>
- /// 加密后的密码
- /// </summary>
- public string PassWord
- {
- get { return _PassWord; }
- set { _PassWord = value; }
- }
- #endregion
- #region 方法
- /// <summary>
- /// 初始化
- /// </summary>
- /// <param name="nUserID">用户ID</param>
- /// <param name="nPassWord">加密后的密码</param>
- public void Initial(string nUserID, string nPassWord)
- {
- UserID = nUserID;
- PassWord = nPassWord;
- }
- /// <summary>
- /// 用户名密码是否正确
- /// </summary>
- /// <param name="nUserID">用户ID</param>
- /// <param name="nPassWord">加密后的密码</param>
- /// <param name="nMsg">返回的错误信息</param>
- /// <returns>用户名密码是否正确</returns>
- public bool IsValid(string nUserID, string nPassWord, out string nMsg)
- {
- nMsg = "";
- try
- {
- //判断用户名密码是否正确
- if (nUserID == "admin" && nPassWord == "admin")
- {
- return true;
- }
- else
- {
- nMsg = "对不起,你无权调用此Web服务,可能有如下原因:/n 1.您的帐号被管理员禁用。/n 2.您的帐号密码不正确";
- return false;
- }
- }
- catch
- {
- nMsg = "对不起,你无权调用此Web服务,可能有如下原因:/n 1.您的帐号被管理员禁用。/n 2.您的帐号密码不正确";
- return false;
- }
- }
- /// <summary>
- /// 用户名密码是否正确
- /// </summary>
- /// <returns>用户名密码是否正确</returns>
- public bool IsValid(out string nMsg)
- {
- return IsValid(_UserID, _PassWord, out nMsg);
- }
- #endregion
- }
(2)添加基于SoapHeader验证的Web Service接口方法:
- /// <summary>
- /// myService 的摘要说明
- /// </summary>
- //[WebService(Namespace="http://MyServer/MyWebServices/")]
- public class myService : System.Web.Services.WebService
- {
- /// <summary>
- /// Soap头实例
- /// </summary>
- public MyHeader myHeader = new MyHeader(); //实例化SoapHead
- public myService()
- {
- //CodeGenerated: 自动生成的代码,该调用是 ASP.NET Web 服务设计器所必需的
- InitializeComponent();
- }
- #region 组件设计器生成的代码
- //Web 服务设计器所必需的
- private IContainer components = null;
- /// <summary>
- /// 设计器支持所需的方法 - 不要使用代码编辑器修改
- /// 此方法的内容。
- /// </summary>
- private void InitializeComponent()
- {
- }
- /// <summary>
- /// 清理所有正在使用的资源
- /// </summary>
- protected override void Dispose(bool disposing)
- {
- if (disposing && components != null)
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
- #endregion
- // WEB 服务示例
- // HelloWorld() 示例服务返回字符串 Hello World
- // 若要生成,请取消注释下列行,然后保存并生成项目
- // 若要测试此 Web 服务,请按 F5 键
- /// <summary>
- /// 正常调用的方法
- /// </summary>
- /// <returns></returns>
- [WebMethod]
- public string HelloWorld()
- {
- return "Hello World";
- }
- /// <summary>
- /// 需要验证的方法,添加SoapHeader标识
- /// </summary>
- /// <param name="contents"></param>
- /// <returns></returns>
- [SoapHeader("myHeader")]
- [WebMethod(Description = "HelloWord", EnableSession = true)]
- public string HelloWorld2(string contents)
- {
- string msg = "";
- //验证是否有权访问
- if (!myHeader.IsValid(out msg))
- return msg;
- return "Hello World:" + contents;
- }
- }
2.客户端调用具有SoapHeader的Web Service
- //创建myService对象
- StudySoapHead.myService service = new StudySoapHead.myService();
- //创建soap头对象
- StudySoapHead.MyHeader header=new StudySoapHead.MyHeader();
- //设置soap头变量
- header.PassWord = "admin";
- header.UserID = "admin";
- service.myHeader = header;
- //调用web 方法
- Console.WriteLine(service.HelloWorld());
- Console.WriteLine(service.HelloWorld2("Valid request!"));
- Console.Read();
通过SoapHeader对用户口令进行验证,只有授权的用户才可以使用该接口。确保了访问接口用户的安全性。