项目开发经常使用web服务,但在使用web服务时,考虑到web服务是一个安全问题,一组用户名和密码很容易防止调用未授权的用户。
一.网络凭证方式
为System.Net命名空间提供网络凭证。 这将确保在网络上提供证书,并且只有获得该证书的用户才能访问相应的服务。 在NetworkCredential中,在IIS中设置发布web服务的服务器的名称,以及登录服务器并调用web服务的用户名和密码。
在调用web服务时设置Credential属性并分配上述Credential证书。 这样,只能使用提供的用户名和密码调用web服务,其他用户则无法访问。 这样可以防止调用web服务。
对于主机名、用户名和口令,B/S可以在webconfig中配置;对于C/S,可以使用APP应用程序配置文件。 以下以C/S为例进行说明。 首先,提供服务器的网络证书,并使用WebRequest验证连接是否成功。 当然,为了确保用户名和密码等安全,可以通过对其进行加密等手段来确保安全。
///
//服务器的网络证书/
///
publicstaticnetworkcredentialmycred (
{ string loginuser=properties.settings.default.username; //用户名
stringloginpsw=properties.settings.default.userpsw; //密码
stringloginhost=properties.settings.default.hostname; //主机名可以是IP地址或服务器名
networkcredentialmycred=newnetworkcredential (loginuser,loginPSW,loginHost ); //networkcredentialmycred=newnetworkcredential (' username ',' 123456 ',' yourip ' ); //'username ',' 123456 ',' yourservername '
returnmyCred;
///
//验证与服务器的连接是否成功,如果连接成功,则返回TRUE///
//服务器web服务URL
///
公共身份验证(字符串URL )。
//定义局部变量
string url=G_Url; //服务器验证只通过机器验证
try{if}(MyWebresponse==null ) ) ) ) ) ) )。
{
webrequestmywebrequest=webrequest.create (URL ); 基于//URL创建连接请求
myweb request.credentials=my cred (; //获得验证的证书是最重要的语言
myWebRequest.Timeout=20000; //单位为毫秒
myweb response=myweb request.getresponse (; //返回连接成功时的信息
}
}无法连接到}catch(webexceptionwex )//服务器。 服务器错误或用户名和密码可能错误
{ if (myweb响应!=空值销毁
{
myWebResponse.Close (;
myweb响应=null;
}返回假;
} Catch (执行Ex ) ) ) ) )。
{ if (myweb响应!=null )
{
myWebResponse.Close (;
myweb响应=null;
}返回假;
}finally{
}返回真;
} privatestaticws _ we basic.ws _ webasicwebasic=null; //实现中国WS_Webasic.WS_Webasic
///
///WS_Webasic初始化//
公共静态ws _ we basic.ws _ webasicws _ we basic
获取{ if (webasic==null )如果we basic为空,则可以通过重新实例化来缩短验证时间并提高效率
//we basic=newz EDI.ws _ we basic.ws _ we basic (); /
/wsBool = Credential(webasic.Url);//URL改为服务器地址 2009-02-25 哭泣的发夹 chhuic@163.comwsBool =Credential(G_Url);if (wsBool == true) //服务器连接验证通过
{
webasic= new WS_Webasic.WS_Webasic();//实例化
webasic.Credentials = MyCred();//得到服务器连接凭证,这样该WebService可以放心的连接了
}
}returnwebasic;
}
}
注:
(1)必须引用 System.Net;
(2)对WebService发访问,在IIS里取消匿名访问权限,若允许匿名访问,就没有必须提供验证凭证了。
二、
在第一种方法的基础上对WebService里的方法进行加密,这里面方法很多,下面提供一种比较常用的方法。在调用方法时多提供两个参数用户加密解密用(当然了提供几个参数看自己的需要而定)。比如有个WebService方法是根据顾客ID获取数据库中的顾客的详细资料为GetCustomerDetailByCustomerID(string custID);如果只提供一个参数,则很容易被别人访问调用,从而顾客资料很容易被别人获取,因此我们对这个方法进行加密GetCustomerDetailByCustomerID(string scustID,string custID,ecustID);这样,只有提供正确的scustID与ecustID这二个参数才能成功调用这个方法,而对于这二个参数scustID与ecustID,则可以通过加密方法生成一个字符串,如scustID='C39134558',ecustID='C39223525',只有这二个参数满足一定的条件时才算验证通过,而对于参数来说,我们也可以提供一个验证,如果scustID里的值C39134558,前面三位必须是C39,紧跟5位13455则相加后的值18进行位操作如,对值18加一个因子,如1,则出现以下的运行:(18+1)%11==8,这样只有最后一位为8才算这个参数值是符合要求的,所以随便输入一个参数如:C39134556,则因为不符合要求,所以验证不能通过。在这里即使二个参数scustID='C39134558',ecustID='C39223525'都对了,则还需要通过这二个参数的进一步的验证才能算成功。至于这二个满足什么要求,一种是可以采用现有的加密机制,也可以自己写一个加密类来袜。 上面只是举一个简单的例子。
通过上面的二个步骤,则可以实现比较安全的WebService调用了。
三、通过通过SOAP Header身份验证
1、我们实现一个用于身份验证的类,文件名MySoapHeader.cs
MySoapHeader类继承自System.Web.Services.Protocols.SoapHeader。且定义了两个成员变量,UserName和PassWord,还定义了一个用户认证的函数ValideUser。它提供了对UserName和PassWord检查的功能。
usingSystem.Web.Services;usingSystem.Web.Services.Protocols;///
///MySoapHeader 的摘要说明///
public classMySoapHeader:SoapHeader
{publicMySoapHeader()
{TODO: 在此处添加构造函数逻辑//}public stringUserName;public stringPassWord;public bool ValideUser(string in_UserName, stringin_PassWord)
{if ((in_UserName == "zxq") && (in_PassWord == "123456"))
{return true;
}else{return false;
}
}
}
2.下面我们创建WebService.asmx,WebService.cs代码如下:
usingSystem;usingSystem.Collections;usingSystem.Web;usingSystem.Web.Services;usingSystem.Web.Services.Protocols;///
///WebService 的摘要说明///
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]public classWebService : WebService
{publicWebService()
{//如果使用设计的组件,请取消注释以下行//InitializeComponent();
}public MySoapHeader header; 定义用户身份验证类变量header
[WebMethod(Description = "用户验证测试")]
[SoapHeader("header")]//用户身份验证的soap头
public string HelloWorld(stringcontents)
{//验证是否有权访问
if(header.ValideUser(header.UserName, header.PassWord))
{return contents + "执行了";
}else{return "您没有权限访问";
}
}
}
3.客户端,创建个Default.aspx
usingSystem;usingSystem.Configuration;usingSystem.Data;usingSystem.Web;usingSystem.Web.Security;usingSystem.Web.UI;usingSystem.Web.UI.HtmlControls;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.WebControls.WebParts;public partial class_Default : System.Web.UI.Page
{protected void Page_Load(objectsender, EventArgs e)
{
com.cn1yw.WebService test= new com.cn1yw.WebService();//web引用(改成您自己的)
com.cn1yw.MySoapHeader Header = new com.cn1yw.MySoapHeader();//web引用创建soap头对象(改成您自己的)//设置soap头变量
Header.UserName = "zxq";
Header.PassWord= "123456";
test.MySoapHeaderValue=Header;//调用web 方法
Response.Write(test.HelloWorld("我是强"));
}
}
四、通过集成windows身份验证
使用 NTML 或 Kerberos 对客户端进行身份验证。
1、将web服务程序设为集成windows身份验证
2、客户端web引用代码
Test.WebReference.Service1 wr = new Test.WebReference.Service1(); //生成web service实例
wr.Credentials = new NetworkCredential("guest","123"); //guest是用户名,该用户需要有一定的权限
lblTest.Text = wr.Add(2,2).ToString(); //调用web service方法
该方案的优点是比较安全,性能较好,缺点是不便于移植,部署工作量大。