xujh
posts - 45, comments - 75, trackbacks - 5, articles - 1
转贴[ASP.NET]基于Forms认证的WebService应用
Posted on 2006-12-18 17:51
xujh
阅读(198)
评论(0)
编辑
收藏
在安全性要求不是很高的ASP.Net程序中,基于Forms的身份验证是经常使用的一种方式,而如果需要对WebService进行身份验证,最常用的可能是基于Soap 标头的自定义身份验证方式。如果对两者做一下比较的话,显然,基于Forms的验证方式更加方便易用,能否将Forms验证方式应用到WebService中去呢?
从理论上讲,使用基于Forms的方式对WebService进行身份验证是可行的,但是使用过程中会存在以下两个问题:
1.基于Forms的验证方式同时也是基于Cookie的验证方式,在使用浏览器时,这个问题是不需要我们考虑的。但对于使用WebService的应用程序来说,默认是不能保存Cookie的,需要我们自己去做这个工作。
2.WebService
既然是一个
A
2A
(Application To Application)
应用程序,使用Web表单进行身份验证显然不太合适,而且,这将不可避免的造成人机交互,使WebService的应用大打折扣。
接下来,我们就分步解决这两个问题:
1.Cookie的保存问题
WebService的客户端代理类有一个属性CookieContainer可用于设置或获取Cookie集合,保存Cookie的任务就交给他了:
System.Net.CookieContainer cookieContainer
=
new
System.Net.CookieContainer();
MyService.WebService service
=
new
App.MyService.WebService();
service.CookieContainer
=
cookieContainer;
2.我们不想使用Web表单进行身份验证,幸运的是,ASP.Net表单验证中的表单页(即Web.config文件中 forms 元素内的loginUrl)同样可以指定为WebService文件。
我们创建一个专门用作身份验证的Web服务,暂且命名为Login.asmx,然后让 loginUrl 等于 “Login.asmx”,当然,还需要在Web.config文件中的 authorization 节中禁止匿名访问(否则我们可就白忙活了),完成配置后的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,对于使用WebService的客户程序来说,真正的实惠在于:可以匿名访问Login.asmx中的方法(当然我们也可以把Login.asmx放在单独的目录中,然后允许对该目录的匿名访问来达个这个目的,但我觉得还是用loginUrl更优雅一些)。
接下来,我们为Login.asmx添加用于身份验证的WebMethod:
[WebMethod]
public
bool
Check(
string
userName,
string
password)
{
if
(userName
==
"
aaaaaa
"
&&
password
==
"
123456
"
)
//
添加验证逻辑
{
System.Web.Security.FormsAuthentication.SetAuthCookie(userName,
false
);
return
true
;
}
else
{
return
false
;
}
}
最后一步工作就是:让客户程序中的WebService实例与Login实例共享CookieContainer。
class
Sample
{
System.Net.CookieContainer cookieContainer
=
new
System.Net.CookieContainer();
public
void
Login()
{
MyServiceLogin.Login login
=
new
App.MyServiceLogin.Login();
login.CookieContainer
=
cookieContainer;
login.Check(
"
aaaaaa
"
,
"
123456
"
);
}
public
void
ShowHelloWorld()
{
MyService.WebService service
=
new
App.MyService.WebService();
service.CookieContainer
=
cookieContainer;
Console.WriteLine(service.HelloWorld());
}
}
Login()以后再ShowHelloWorld(),你是否看到了我们熟悉的“Hello World”?Ok,就这么简单!
Powered by:
博客园
Copyright © xujh
导航
博客园
首页
新随笔
联系
订阅
管理
<
2006年12月
>
日
一
二
三
四
五
六
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
(6)
给我留言
查看留言
我的标签
防止ASP.NET按钮多次提交的办法
(1)
双缓冲
(1)
height 100%
(1)
随笔分类
ASP.NET(4)
Delphi
移动开发(2)
随笔档案
2008年8月 (2)
2008年7月 (2)
2007年11月 (2)
2007年9月 (1)
2007年4月 (3)
2006年12月 (2)
2006年4月 (2)
2006年2月 (2)
2005年12月 (5)
2005年11月 (1)
2005年8月 (1)
2005年6月 (2)
2005年4月 (4)
2005年3月 (2)
2005年2月 (1)
2005年1月 (1)
2004年12月 (4)
2004年11月 (8)
相册
旅游
我的链接
我的另一个网站
最新评论
1. re: [Javascript]showModalDialog函数的使用
mark.
--傲然林
2. re: 【ASP.NET】防止ASP.NET按钮多次提交的办法
呵呵,抛砖引玉。这个功能是大家都要用到的,但是可以看到这么多人有这么多种方法,而且各有优缺点。其他讨论出一个最优的方案来。
--xujh
3. re: 【ASP.NET】防止ASP.NET按钮多次提交的办法
还有一种方案:
就是不要“自己提交给自己”
可以使用@Page 页面指令 SmartNavigation Attribute
--Microshaoft
4. re: 【ASP.NET】防止ASP.NET按钮多次提交的办法
<%@ Page language="c#" AutoEventWireup="true"%> <!DOCTYPE HTML PU...
--Microshaoft
5. re: 【ASP.NET】防止ASP.NET按钮多次提交的办法
通用的防止F5刷新,重复提交应该在服务器端代码控制! 结合【cookie 时间戳】与【隐藏域 时间戳】对比 我们只要把【cookie 时间戳】每次都刷新 当F5实际浏览器重复提交了上次的 【隐藏域 时...
--Microshaoft
阅读排行榜
1. [Javascript]showModalDialog函数的使用(3980)
2. [ASP.NET]如何点击按钮弹出新窗口,输入数据后返回并刷新页面?(C#代码) (2940)
3. [Javascript]关于在ASP.NET环境中调用梅花雨的日历控件出错的解决办法 (2296)
4. [Delphi]在Delphi中使用由.NET开发的Web Service返回的DataSet类型(2153)
5. 【ASP.NET】防止ASP.NET按钮多次提交的办法(1971)
评论排行榜
1. 【ASP.NET】防止ASP.NET按钮多次提交的办法(25)
2. [Delphi]转换Dialogic Vox文件为Wave文件 (15)
3. [ASP.NET]制作一个简单的多页Tab功能(9)
4. [Delphi]在Delphi中使用由.NET开发的Web Service返回的DataSet类型(6)
5. [Javascript]showModalDialog函数的使用(5)