使用ASP.Net Forms模式实现WebService身份验证 补充

今天看Webservice验证的问题,上午看了一下Soap头验证,个人感觉WebService SoapHeader的使用这个实现的比较好,代码我也实现了放在最后,下午看了一下Session验证,我没搞定,又看了一下Cookie验证,以前也做过Forms验证的方法,不过以前用的是WebFrom要输入用户名和密码,可以参照Sending Files in Chunks with MTOM Web Services and .NET 2.0 这个使用,如果你遇到和我相同的问题WSE编译时报错无法解决,可以看我的百度博客上的解决方法MTOM Web Services 编译出错问题

下午看的是使用ASP.Net Forms模式实现WebService身份验证 这位实现的,在Web.config配置文件中加入以下代码后:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
       <compilation debug="false" />
      <authentication mode="Forms">
        <forms name="MyService" loginUrl="Login.asmx"></forms>
      </authentication>
      <authorization >
        <deny users="?"/>
      </authorization>
    </system.web>
</configuration>

浏览器访问Login.asmx文件是效果实现了,但是如果把方法不放在Login.asmx文件里,添加Web引用的时候是根本不行的,还要转到Login.asmx里面来,要是把实现方法放到这个文件里,作者也说了

 

“其实我们并不想在未通过身份验证时让浏览器转向到Login.asmx,对于使用WebService的客户程序来说,真正的实惠在于:可以匿名访问Login.asmx中的方法(当然我们也可以把Login.asmx放在单独的目录中,然后允许对该目录的匿名访问来达个这个目的,但我觉得还是用loginUrl更优雅一些)。”

 

客户程序可以匿名访问,我想这不是大家所要的达到的目的,当然是为了验证。要是可以匿名访问还费事干什么。我看评论,很多人和我遇到情况差不多,还是我们都理解错了呢,我在百度上的搜,全都是这篇文章的转栽,也不要知道转载的人试没试。作者没有贴出代码链接来,我自己实现了一下,并做了一下补充;Login.asmx文件内容如下:

/// <summary>
/// Login 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class Login : System.Web.Services.WebService
{
    [WebMethod(Description = "登录")]
    public bool LoginIn(string userName, string password)
    {
        if (userName == "admin" && password == "admin")
        {
            System.Web.Security.FormsAuthentication.SetAuthCookie(userName, false);
            return true;
        }
        else
        {
            return false;
        }            
    }

    private bool LoginCheck()
    {
        if (HttpContext.Current.User.Identity.IsAuthenticated)
        {
            return true;
        }
        return false;
    }

    [WebMethod(Description = "退出")]
    public void LoginOut()
    {
        if (LoginCheck())
        {
            System.Web.Security.FormsAuthentication.SignOut();
        }
    }

    [WebMethod(Description="Hello")]
    public string HelloWorld(string name)
    {
        if(LoginCheck())
        {
            return "Hello:"+name;
        }
        else
        {
            return "error";
        }
    } 

为了实现效果,我做了个WinFrom的Demo,如果选择“直接调用”会返回错误(如图2),“登录调用”没有问题(如图1),使用过一次“登录调用”后,再使用“直接调用”也不会返回错误了,因为现在已经有Cookie了,如果点了“退出”按钮后或是退出程序重新开打后,再使用使用“直接调用”就又会报错了。

图1

1

图2

2

本文代码

Soap头验证代码

原文地址:http://www.cnblogs.com/chinadhf/archive/2006/10/08/520975.html

posted @ 2010-12-01 17:46  wk986  阅读(1252)  评论(2编辑  收藏  举报