(通常webservice 加密都是加Token.其实就是在SOAP包的包头里面加个用户名和密码... 在C#封完包后,操作包头好了)
7.9 如何保证Web Service的安全
要以安全的方式访问Web服务方法,可以考虑以下安全措施:
是谁调用?--SoapHeader身份认证。
来自哪里?--访问IP认证。
加密传输 --SSL安全访问。
这些安全保护措施常常是配合使用的。
7.9.1 通过SoapHeader来增强Web Service的安全性
通过SoapHeader我们可以让具有指定用户口令的用户来访问我们的Web服务接口。(完整代码示例位置:光盘\code\ch07\WebAppClient\WebForm-SoapHeader.aspx)
1.Web Service实现步骤
(1)定义自己的SoapHeader派生类。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
//<summary>
//定义自己的SoapHeader派生类
//</summary>
public class MySoapHeader : System.Web.Services.Protocols.SoapHeader
{
private string _UserID = string.Empty;
private string _PassWord = string.Empty;
//<summary>
//构造函数
//</summary>
public MySoapHeader()
{ }
//<summary>
//构造函数
//</summary>
//<param name="nUserID">用户ID</param>
//<param name="nPassWord">加密后的密码</param>
public MySoapHeader(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>
private 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>
private bool IsValid(string nUserID, string nPassWord, out string nMsg)
{
nMsg = "";
try
{
//判断用户名密码是否正确
if (nUserID == "admin" && nPassWord == "admin")
{ return true; }
else
{
nMsg = "对不起,你无权调用此Web服务。";
return false;
}
}
catch
{
nMsg = "对不起,调用异常,你无权调用此Web服务。";
return false;
}
}
//<summary>
//验证用户名密码是否正确
//</summary>
//<returns>用户名密码是否正确</returns>
public bool IsValid(out string nMsg)
{
return IsValid(_UserID, _PassWord, out nMsg);
}
#endregion
}
(2)添加基于SoapHeader验证的Web Service接口方法:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Services;using System.Web.Services.Protocols;
/// <summary>///CabinDutyLeaderInfoWS 的摘要说明/// </summary>[WebService(Namespace = "http://tempuri.org/")][WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]//若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 // [System.Web.Script.Services.ScriptService]public class CabinDutyLeaderInfoWS : System.Web.Services.WebService {
//声明Soap头实例 public MySoapHeader myHeader = new MySoapHeader();
public CabinDutyLeaderInfoWS () {
//如果使用设计的组件,请取消注释以下行 //InitializeComponent(); }
//需要SoapHeader验证 [SoapHeader("myHeader")] [WebMethod] public string HelloWorld() { string msg = ""; //验证是否有权访问 if (!myHeader.IsValid(out msg)) { return msg;//返回错误信息 } return "Hello World"; } }
2.客户端调用具有SoapHeader的Web Service
//创建myService对象
DutyLeaderWebReference.CabinDutyLeaderInfoWS service = new CabinDutyLeaderInfoWS();
//创建soap头对象
DutyLeaderWebReference.MySoapHeader header = new DutyLeaderWebReference.MySoapHeader();
//设置soap头变量
header.PassWord = "admin";
header.UserID = "admin";
service.MySoapHeaderValue = header;
//调用web 方法
string strPrice = service.HelloWorld();
this.lblTtxt.Text = strPrice;
通过SoapHeader对用户口令进行验证,只有授权的用户才可以使用该接口。确保了访问接口用户的安全性。