如何编写需要授权才能使用的WebService?

接触WebService没多久,一个令我困扰的问题就是怎么样给自己开发的WebService加上身份认证的功能,因为我不想什么乱七八糟的人使用我的服务,因为这个WebService可能存在一些有关个人隐私的信息,除了授权的人之外,闲杂人等一律要拒之门外。这个对于Windows应用程序来说易如反掌的功能在WebService上应该如何实现呢?
  具体如何实现者一功能有许多方法,在CodeGuru的Build Secure Web Services With SOAP Headers and Extensions
http://www.codeguru.com/Csharp/Csharp/cs_webservices/security/article.php/c5479/

文章中使用了一种不错的方法,可以大体上解决我的问题,但是在Quotes2实现里每次都需要验证一次用户名和密码,而Quote3实现的方法假如使用HTTP GET和HTTP POST好像又会失效,总是感觉美中不足,有没有一种方法可以对WebService的任何调用方式都有效呢?经过多方查找资料,终于找到一个可行的方法:利用Session。假如你编写过Web应用程序的话,对于Session肯定不陌生,对于需要保持状态的程序而言,Session和Application是必不可少的,比如那些论坛和留言版等等。我们这里就要利用相同的机制实现用户认证。
  首先我给WebService添加一个名为Login的方法:
复制   保存
[WebMethod(EnableSession = true)]
public string Login(string userName, string password)
{
    if (userName == "username" && password == "password")
    {
        Session["login"] = 1;
        return "welcome";
    }
    else
        return "login failed";
}

这里仅仅是一个示例,因此我简化了用户的认证过程,Login方法很简单,它所作的工作就是在用户身份验证通过之后将Session["login"]置为1表示用户通过验证,否则返回"login failed"的错误信息。这里的实现和一般的WebMethod没有什么区别,除了多了一个属性EnableSession = true之外。这是我们实现认证功能的关键所在,在这个WebService中,所有的方法都必须使用这个属性加以标记。
  好了,服务器端的工作就查不多了(这么简单,不可思议吧),为了检验我们这个方法是否有效,我们再添加一个方法验证一下:
复制   保存
[WebMethod(EnableSession = true)]
public string GetStatus()
{
    if (Convert.ToInt32(Session["login"]) == 1)
        return "Thank you.";
    else
        return "Please Login first.";
}

现在我们来编写一个客户端验证一下到底这个方法是否有效,新建一个控制台程序TestCon,添加这个程序的Web引用,并把引用文件夹重命名为login,编写如下代码:
复制   保存
using System;
using System.Data;
using System.Data.SqlClient;
using TestCon.login;

class MainEntryPoint
{
    static void Main(string[] args)
    {
        LoginService ls = new LoginService();
        Console.WriteLine(ls.Login("username", "password"));
        Console.ReadLine();
        Console.WriteLine(ls.GetStatus());
    }
}

Ctrl+F5运行程序,程序运行结果如下:

单击显示全图,Ctrl+滚轮缩放图片

呵呵,结果好像不对,用户名和密码都没错,调用GetStatus为什么失败了呢?想想这这结果是理所当然的,Session保存数据是靠cookie实现的,我们这个是一个普通的控制台程序,它又没什么地方存放cookie信息,自然不能正确使用了。假如用一个asp程序测试的话,认证功能已经实现,不信你试一下!
  但是我们要在普通的应用程序中实现用户认证,难道就没有办法了么,当然有了,既然程序没地方存放cookie,那我们给它一个不就完了嘛,好,我们改写程序如下:
复制   保存
using System;
using System.Data;
using System.Data.SqlClient;
using System.Net;
using TestCon.login;

class MainEntryPoint
{
    static void Main(string[] args)
    {
        LoginService ls = new LoginService();
        CookieContainer cc = new CookieContainer();
        ls.CookieContainer = cc;
        Console.WriteLine(ls.Login("username", "password"));
        Console.ReadLine();
        Console.WriteLine(ls.GetStatus());
    }
}

再Ctrl+F5,变:

单击显示全图,Ctrl+滚轮缩放图片

哈,这下对了吧,功夫不负有心人,这下你想用我的WebService就没那么容易了吧,搞定,呵呵!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
服务安全代理(securityproxy)介绍 war包 运行环境为 jdk1.5+tomcat5+ant+axis2v1.4.1+rampartv1.4 需要的lib如图lib-need-pic.jpg所示(可从官网下载这些lib) 1)webservice的安全需求 安全性 服务访问需要适当的访问控制:认证授权、机密性、完整性。安全性可以分为3级。 灵活性 设计态服务无需考虑安全治理,所以要求提供灵活的的运行态安全标准支持。服务的安全架构是影响服务安全灵活性的重要因素。 适应性 在各种平台下对服务提供统一的安全、审计、日志管理。简化服务提供和服务管理,服务安全及基础设施实施复杂性小。 2)服务安全代理(securityproxy)实现原理 通过设置安全策略(Policy)对服务(webservice)提供实时的访问管理和控制。 通过策略来控制和管理对服务的访问,能够简单灵活的实现访问服务时的安全机制。 服务安全代理(securityproxy)在管理节点(Managed Endpoint)中实现策略 服务安全代理(securityproxy)改变了客户端与服务节点的连接结构 ——它创建了一个管理节点插入到客户端与服务节点之间 一个节点(Endpoint)指对应某个服务的地址(URL)。 随后客户端直接与管理节点连接,而不是与实际的服务节点连接 在管理节点中,服务安全代理(securityproxy)拦截消息并验证他们是否符合策略。 把安全的实现从复杂的编程中解脱出来,通过策略配置实时的组成不同的策略集合实施起来。 通过服务安全代理(securityproxy)可以 ●Authentication(认证) 发送消息时添加用户名令牌或数字签名。接收消息时验证用户名令牌或数字签名。 ●Encryption(加密) 在两个节点之间加密信息。发送信息时加密,接收信息时自动解密。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值