WebService身份验证解决方案
解决方案一:通过SOAP Header传递用户名和密码。
1. 首先需要在服务中定义一个从 SOAPHeader 派生的类,表示传入 SOAP 标头的数据。
代码如下:
public class SecurityHeader : System.Web.Services.Protocols.SoapHeader
{
private static string Key = System.Configuration.ConfigurationManager.AppSettings["PublicKey"];
public string PublicKey = string.Empty;
public bool IsValid()
{
if (Key != PublicKey)
{
return false;
}
else
{
return true;
}
}
}
2. 在Web Services使用 SoapHeader 自定义属性定义一组关联的标头,服务中的每个 WebMethod 都可以使用.(默认情况下,标头是必需的,但也可以定义可选标头)
WebService.asmx内容如下:
public SecurityHeader SecHeader;
[SoapHeader("SecHeader"), WebMethod(Description = "加入了身份验证的Web服务", EnableSession = true)]
public string HelloWorld (string contents)
{
//验证是否有权访问
if(!SecHeader.IsValid()) return null;
return "Hello World";
}
3. 最后客户端在调用要求标头的方法之前,需直接在代理类上设置标头。
SecurityHeader SecHeader = new SecurityHeader();
SecHeader.PublicKey = "abc";
WebService uService = new WebService();
uService.SecurityHeaderValue = SecHeader;
uService.HelloWorld();
通过以上步骤就可以完成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方法
该方案的优点是比较安全,性能较好,缺点是不便于移植,部署工作量大。