[转]ASP.NET跨应用程序进行登录的解决

原创 2004年11月04日 11:04:00

最近一个朋友问我一个问题:

       如何可以将ASPdotNET Forum2.0放到他的一个项目中(好象网上也有人讨论过如何将dotText和ASPdotNET Forum等开源项目集成起来的),他原来的项目已经有一套用户登录机制了,而且用户数据库也是现成的,如何使得在他原来系统上登录后就可以直接转到Forum上,而又不需要再次输入用户信息呢?刚开始感觉a piece of cakecake.gif...象这种一次登录,然后可以访问多个应用其实在很久就已经提出来了,在几年前还帮公司做过一个类似的产品原型,但那个是针对异构网站的,说白了就是做一个代理,只是内部有套机制将后面的几个异构网站的用户数据库映射起来而已。这种方式看起来似乎可以解决问题,但数据库之间的映射关系处理起来很麻烦,如果下面应用多了的话,工作量是很大的。

        对于这种技术,似乎有个名词叫Single Sign On,有点象网易的通行证了。如果内部网站是同一批人做的倒问题不大,只要协调好了这个通行证的格式和一些相关的问题就可以了。而朋友的情况似乎也没有那么复杂,他原来的项目也是用.NET平台技术的。.NET平台下是否有比较好的整合解决方案呢?72_72.gif


这自然涉及到了.NET平台下验证的相关问题了。ASP.NET自身已经支持三种验证方式(不包括None):
1. Windows身份验证,新建立一个Web应用,似乎缺省就是用这样的方式的。显然这个不是需要的。
2. Passprot身份验证,需要Microsoft支持,它其实提供了一个WebServices来帮助你统一完成验证工作,使   用这个在内部 网项目中似乎没有太大必要。
3. Forms身份验证,通过Cookie来传递身份验证信息,看起来类似通行证之类的,应该是要找的东西了。

图是Forms身份验证的数据流程图(MSDN中的)

Forms.JPG

       上图十分清晰的描述了Forms身份验证的基本原理,但是对于多个应用呢?仔细查MSDN(MSDN真的好多资料啊,经常看过了再想翻回去已经忘记在那里找出来的了 cry_smile.gif  BTW:有没有MSDN书签功能的?),发现相关的描述很多,但只有一个“跨应用程序进行Forms 身份验证”比较具体,而内容就简单些了。

看来还是需要自己先动手做个简单的测试来边试边查资料了shades_smile.gifshades_smile.gifshades_smile.gif...



先建立一个testLogon的Web应用
主要文件包括:
default.aspx (通过验证跳入的页面)
test1.apsx   (登录的页面)
Global.asax 
Web.config   (配置文件)

再建立另外一个testLogon2的Web应用
主要文件:
default.aspx (通过验证跳入的页面)
Global.asax
Web.config    (配置文件)



测试最终达到的效果:
两个Web应用的default都是受保护的,没有通过验证是不可以进入的,即使在输入访问地址URL,会自动跳转到testLogon/test1.aspx要求登录,当登录通过后,则可以任意在两个应用的default.aspx跳转。
testLogon/default.aspx中有Logout的功能,Logout后则需要重新登录了。

要达到这个效果,基本设置需要:
1.将IIS配置为允许匿名访问,保证可以通过IIS来控制传递请求给ASP.NET;
2.如果必要传输过程配置为SSL,这里没有这个必要了;
3.对应的两个应用的配置文件必须设成一致;

以上这些基本设置在MSDN中都可以找到相关的描述,但是实验这个效果到成功却花费了比预计长的时间,因此觉得十分有必要将其记录下来,对自己对他人都有好处。

得到的经验教训如下:
1.配置文件Web.config中,将验证模式设为Forms,而且在下面的参数中,要保证两边一致
testLogon的Web.config对应部分

None.gif    <authentication mode="Forms">
None.gif    
<forms name=".AspNetForums" protection="Encryption" timeout="60" loginUrl="test1.aspx" />
None.gif    
</authentication>
None.gif

testLogon2的Web.config对应部分

None.gif    <authentication mode="Forms">
None.gif       
<forms name=".AspNetForums" protection="Encryption" timeout="60" loginUrl="/testLogon/test1.aspx" />
None.gif    
</authentication>
None.gif


2.<machineKey>的增加是必须的
为保证两边两边应用对cookie的处理和读取一致,这个属性是必须的,且要相同

None.gif     <machineKey
None.gif         
validationKey= "C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" 
None.gif         decryptionKey
= "8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" 
None.gif         validation
="SHA1"> 
None.gif     
</machineKey>
None.gif



3.MSDN虽然要查,但不可以完全依靠,特别是代码
在MSDN中,关于machineKey的代码如下:

None.gif<configuration>
None.gif    
<system.web>
None.gif        
<authentication>
None.gif            
<forms name=".ASPXAUTH" 
None.gif                   loginUrl
="logon.aspx"     
None.gif                   protection
="all"  <!-- Protection must be identical.-->
None.gif                   timeout="30" 
None.gif                   path="/" >   
<!-- Path must have a compatible scope.-->
None.gif        
</authentication>
None.gif
None.gif        
<!-- Validation and decryption keys must exactly match and cannot
None.gif             be set to "AutoGenerate". The validation algorithm must also 
None.gif             be the same. 
-->
None.gif        
<machineKey>
None.gif            validationKey= "C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" 
None.gif            decryptionKey= "8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" 
None.gif            validation="SHA1"
None.gif            isolateApplications="false"
None.gif        
</machineKey>
None.gif    
</system.web>
None.gif
</configuration>
None.gif

 

但显然有着错误的,大家编译一下就知道了,格式错了,而且isolateApplication也不是这样用的

4.为保证两边读到的cookie一致,不要用isolateApplication,它使得各自用自己的cookie了。

5.关于Global.asax的注意,对于Web.config中authentication的节点会触发Global.asax中的事件的,对应

函数是

None.gifprotected void Application_AuthenticateRequest(Object sender, EventArgs e)
None.gif


6.研究一下ASPdotNetForum2.0代码发现,Global.asax不见了,而在它的配置文件中多了一项

None.gif        <httpModules>
None.gif            
<add name="AspNetForums" type="AspNetForums.ForumsHttpModule, AspNetForums.Components" />
None.gif        
</httpModules>
None.gif


是的,看一下ForumsHttpModule的源码,结构和Global.asax基本一样,一样有个事件触发函数

None.gif private void Application_AuthenticateRequest(Object source, EventArgs e) 
None.gif



       下面不用我多说了吧?具体该如何做到和dotNetForum一起达到SSO的目标的答案已经出来了 tongue_smile.gif

例子代码下载
 

ASP.NET跨应用程序进行登录的解决

原文地址:http://www.cnblogs.com/windsails/archive/2004/10/15/52818.html最近一个朋友问我一个问题:       如何可以将ASPdotNE...
  • kong521
  • kong521
  • 2008年05月25日 23:11
  • 367

ASP.NET跨应用程序进行登录的解决

http://www.cnblogs.com/windsails/archive/2004/10/15/52818.aspx
  • suilam
  • suilam
  • 2004年10月27日 00:30
  • 621

ASP.NET跨应用程序进行登录的解决 (摘)

最近一个朋友问我一个问题:       如何可以将ASPdotNET Forum2.0放到他的一个项目中(好象网上也有人讨论过如何将dotText和ASPdotNET Forum等开源项目集成起来的)...
  • aivii
  • aivii
  • 2005年06月07日 15:03
  • 793

ASP.NET中"/"应用程序中的服务器错误的方法

ASP.NET中”/”应用程序中的服务器错误
  • u010349629
  • u010349629
  • 2017年07月14日 21:20
  • 981

ASP.NET跨应用程序进行 Forms 身份验证

转载:http://msdn2.microsoft.com/zh-cn/library/eb0zx8fc(VS.80).aspxASP.NET 支持在分布式环境中(跨单个服务器上的多个应用程序或在网络...
  • hyl8218
  • hyl8218
  • 2007年09月26日 09:06
  • 900

ASP.NET 安全认证——巧妙实现 Form 表单认证跨站点、跨服务器的单点登录

ASP.NET 安全认证(四)——巧妙实现 Form 表单认证跨站点、跨服务器的单点登录(Single Sign On) 作者:寒羽枫(cityhunter172) 第四部分 Form 认证的补充  ...
  • ymzprofessional
  • ymzprofessional
  • 2006年12月29日 13:06
  • 742

asp.net网站不同子域名共享session信息

1session信息可序列化 [Serializable] [Serializable] public class UserSession { public st...
  • xuexiaodong2009
  • xuexiaodong2009
  • 2017年08月01日 14:53
  • 446

ASP.NET Web应用程序与ASP.NET Web服务应用程序有什么区别

ASP.NET Web应用程序就是一个网站,B/S架构,客户通过浏览器获取服务器上运行的该应用程序上的业务功能。 ASP.NET Web服务应用程序是一个远程服务,必须被其他网站引用才可以正常被用户...
  • kay_1010
  • kay_1010
  • 2014年03月12日 13:00
  • 2998

vs2010里面 新建网站里面的 asp.net网站 和 新建项目里面的 asp.net Web应用程序 的区别 (下)

地址:http://www.cnblogs.com/iceicebaby/archive/2012/02/21/2361686.html 二:下面是 通过 新建项目 来创建 ASP.NET ...
  • sophiasy
  • sophiasy
  • 2017年01月05日 16:22
  • 1144

跨站点脚本编制

“跨站点脚本编制”攻击是一种隐私违例,可让攻击者获取合法用户的凭证,并在与特定 Web 站点交互时假冒这位用户。  这个攻击立足于下列事实:Web 站点中所包含的脚本直接将用户在 HTML 页面...
  • KerryRuan
  • KerryRuan
  • 2016年04月06日 13:11
  • 5249
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[转]ASP.NET跨应用程序进行登录的解决
举报原因:
原因补充:

(最多只允许输入30个字)