使用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

你可能感兴趣的:(webservice)