zoukankan      html  css  js  c++  java
  • 使用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

  • 相关阅读:
    20182320《程序设计与数据结构》第八周学习总结
    20182320《程序设计与数据结构》第七周学习总结
    20182320 2019-2020-1 《数据结构与面向对象程序设计》实验6报告
    实验5
    20182320《程序设计与数据结构》第六周学习总结
    20182320 2019-2020-1 《数据结构与面向对象程序设计》第5周学习总结
    实验4
    20182320 2019-2020-1 《数据结构与面向对象程序设计》第4周学习总结
    实验3
    实验2报告
  • 原文地址:https://www.cnblogs.com/wk986/p/1893711.html
Copyright © 2011-2022 走看看