当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 简单Web service 身份验证解决方案

ASP.NET
二级域名Cookie问题的解决方法
如何为asp.net网站项目添加子项目
asp.net用url重写URLReWriter实现任意二级域名
asp.net 序列化and反序列化演示
asp.net Timer的使用方法
AjaxControlToolKit DropDownExtender(下拉扩展控件)使用方法
AjaxControlToolKit CalendarExtender(日历扩展控件)的使用方法
让GridView只显示特定用户的数据的方法
让GridView只更新某些特定的数据的方法
ajaxControlToolkit中CascadingDropDown的用法说明
axp.net ScriptManager的简单用法
把程序集安装到全局程序集缓存中的步骤
引用全局程序集缓存内的程序集的方法
asp.net COOKIES需要注意的一点
asp.net UrlReWriter使用经验小结
页面导出为Excel的时间格式的问题
asp.net cookie清除的代码
Asp.net XMLHTTP封装类(GET,Post发送和接收数据)
ASP.NET XmlHttp跨域访问实现代码
Asp.NET 随机码生成基类(随机字母,随机数字,随机字母+数字)

ASP.NET 中的 简单Web service 身份验证解决方案


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-11   浏览: 172 ::
收藏到网摘: n/a

问题提出:为了构建一个安全的web服务,需要对调用方进行身份验证,只让通过审核的用户调用web服务。

软件环境:Web服务程序部署在分布于各地的工厂服务器,这些服务器位于内网之中,没有固定外网IP,且不能通过外网进行访问。调用这些Web服务的是一台连接至internet的WEB服务器,该WEB服务器通过VPN与各个工厂的服务器相连。
解决方案一:通过SOAP Header传递用户名和密码。
1. 首先需要在服务中定义一个从 SOAPHeader 派生的类,表示传入 SOAP 标头的数据。

复制代码 代码如下:

public class CredentialSoapHeader : System.Web.Services.Protocols.SoapHeader
{
private string _UserID=string.Empty;
private string _PassWord=string.Empty;
public string UserID
{
get{return _UserID;}
set{_UserID=value;}
}
public string PassWord
{
get{return _PassWord;}
set{_PassWord=value;}
}
public void Initial(string nUserID,string nPassWord)
{
UserID=nUserID;
PassWord=nPassWord;
}
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);
}
}

2. 在Web Services使用 SoapHeader 自定义属性定义一组关联的标头,服务中的每个 WebMethod 都可以使用.(默认情况下,标头是必需的,但也可以定义可选标头)
Test.asmx代码片段:
复制代码 代码如下:

public CredentialSoapHeader myHeader=new CredentialSoapHeader();
// WEB 服务示例
[SoapHeader("myHeader")]
[WebMethod(Description="加入了身份验证的web服务",EnableSession=true)]
public string HelloWorld (string contents)
{
string msg = "";
//验证是否有权访问
if(!myHeader.IsValid(out msg))
return msg;
return "Hello World:"+contents;
}

3. 最后客户端在调用要求标头的方法之前,需直接在代理类上设置标头。
以下是winform客户端代码片段:
复制代码 代码如下:

SoapTest.Test test1 = new SoapHeader.SoapTest.Test();
//创建soap头对象
SoapTest.CredentialSoapHeader header = new SoapHeader.SoapTest.CredentialSoapHeader();
/设置soap头变量
header.PassWord = "admin";
header.UserID = "admin1";
test1.CredentialSoapHeaderValue = header;
//调用web 方法
this.label1.Text = test1.HelloWorld ("wang");

通过以上步骤就可以完成Web Services自定义身份验证了. 该方案的优点是代码灵活,便于移植,缺点是传递的信息没有加密,可配合SSL进行使用。
解决方案二:通过集成windows身份验证。
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方法

该方案的优点是比较安全,性能较好,缺点是不便于移植,部署工作量大。