使用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
图2
原文地址:http://www.cnblogs.com/chinadhf/archive/2006/10/08/520975.html