soapheader实现身份验证,撒分拉!!
我现在做Webserver,实现身份验证,需要用到soapheader,但我不知道soapheader怎么弄,以前从来没有接触过 soapheader.
各位高人,谁能给我个指导或例子,在下不甚感激。
问题点数:20、回复次数:16Top
1 楼wooting(不醉)回复于 2006-09-20 09:28:46 得分 10
No.1 先定义一个SoapHeader
/// <summary>
/// 定义SoapHeader.
/// </summary>
public class CredentialSoapHeader : SoapHeader
{
public string Username;
public string PasswordHash;
public string SecurityKey;
}
-------------------------------------------------------
No.2 定义安全类,继承WebService。并提供验证方法。
public class SecureWebService : WebService
{
public CredentialSoapHeader Credentials;
protected string VerifyCredentials()
{
if (this.Credentials == null
|| this.Credentials.Username == null
|| this.Credentials.PasswordHash == null)
{
throw new SoapException("没有提供信任令牌",
SoapException.ClientFaultCode, "Security");
}
return CheckCredential(this.Credentials);
}
}
----------------------------------------------------------------------
No.3 让你发布的webservice继承你的安全类。
public class SecureService : SecureWebService
{
public SecureService()
{
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
}
-----------------------------------------------------------
No.4发布你的Webservice。在客户端对SoapHeader赋值,调用Webservice。完成。Top
2 楼wangzhengxing()回复于 2006-09-20 12:06:45 得分 0
谢谢楼上的。Top
3 楼wooting(不醉)回复于 2006-09-20 19:44:09 得分 0
呵呵。记得结贴。Top
4 楼king951789(king)回复于 2006-09-23 10:56:04 得分 0
DINGTop
5 楼zlz_212(ShREk)回复于 2006-09-25 11:11:03 得分 0
SoapHeader实现验证,好像安全性不太好,最好能结合SSLTop
6 楼longhorn008(菜鸟.net)回复于 2006-10-20 13:57:08 得分 0
作个标记Top
7 楼wenjunqianli(文军)回复于 2006-10-25 10:30:45 得分 0
借个地方用用,怎么调用,webconfig里应该怎么写?Top
8 楼rosanshao(罗三少)回复于 2006-10-30 12:39:16 得分 0
No.3 让你发布的webservice继承你的安全类。
public class SecureService : SecureWebService
{
public SecureService()
{
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
}
-----------------------------------------------------------
No.4发布你的Webservice。在客户端对SoapHeader赋值,调用Webservice。完成。
这样同样还不安全,或者使用起来很不方便,要限制登陆后才能访问的还必须调用VerifyCredentials()
这个方法,感觉不好,还没有真正做到可重用Top
9 楼Radar2006(中华英雄)回复于 2006-10-31 08:48:59 得分 10
/// <summary>
/// 添加Soap头来增加Web Service的安全性
/// 添加类:MyHeader 从 System.Web.Services.Protocols.SoapHeader继承
/// </summary>
public class MyHeader : 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 == "WCP" && nPassWord == "6~q3%$d")
{
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
Top
10 楼rosanshao(罗三少)回复于 2006-10-31 09:15:55 得分 0
问题是public bool IsValid(string nUserID,string nPassWord,out string nMsg)
这个在哪儿调用,每个方法里,如果在每个方法里都要调用这个方法,这种方式明显不能解决问题。Top
11 楼scow(怡红快绿之小橙子|和谐权是第4代人权)回复于 2006-10-31 09:27:30 得分 0
每个都要调,它是基于消息的验证,不是像asp.net的forms验证那样一次验证就行了.
虽然可以对于一个webservice实例只赋一次soapheader值.Top
12 楼rosanshao(罗三少)回复于 2006-10-31 15:27:15 得分 0
这样我倒愿意用Session,这样可以写个基类来继承,可以解决上样问题,我一直在想用SoapHeader,又可以只验证一次。Top
13 楼wskyo(呆呆虫)回复于 2006-11-03 10:57:26 得分 0
作个标记Top
14 楼happyamei(啊梅)回复于 2006-11-03 14:31:13 得分 0
收藏下Top
15 楼ycqing()回复于 2006-11-09 12:00:40 得分 0
ding
Top
16 楼fancystyle(鳞)回复于 2006-11-09 12:44:54 得分 0
想知道如何只验证一次的方法.如果只是读取可以不验证.只把写操作的验证.
其他还有什么方法实现验证不用WINDOWSTop




