在ASP.NET应用程序中捕捉身份验证状态的变化

asp.net|程序

  前年我写过一篇随笔抱怨Microsoft在ASP.NET架构中Session_End事件上处理,说来惭愧,其实当年我对ASP.NET运行时的复杂性理解不足。实话说,捕捉通过身份验证和注销身份验证对我来说,意义重大。例如:

  在登录前先检查是否已经存在SSO提供器;

  登录完成后加载相关的权限,这些加载过程可能与具体应用项目完全无关;

  登录结束后通知SSO提供器清除Cookie内容;

  ......

  目前的ASP.NET提供的解决方案是在Global.cs中加上FormsAuthentication_OnAuthenticated方法来捕捉已通过验证事件。该方法的缺陷是:

  1.只能捕捉Forms身份验证方式,而不能捕捉Windows和Passport认证方式;

  2.只能捕捉已通过身份验证事件而不能捕捉身份注销事件;

  3.必须修改global.cs文件。

  以上任何一个缺陷都是我无法接受的。当时在ASP.NET1.1解决那个问题时用了五六个接口,十多个类,并且有一个输出类要求应用程序登入和注销时访问相应的方法,而不是自由地使用FormsAuthentication的相关方法。现如今该问题总算比较满意地解决了。思路是这样的:

  在一个HttpModule中建立两张会话表,一张记录已通过身份验证的会话;另一张记录未通过身份验证的会话,这样,在HttpApplication.AcquireRequestState事件中查找每个会话在这两张表中的状态:

  状态一 两张表中都没有 这是一个新的会话

  状态二 在已通过身份验证的会话表中 已通过身份验证

  状态三 在未通过身份验证的会话表中 未通过身份验证

  如果是状态一,则立即调用所有SSO提供器的身份查验方法,只要有任何一个SSO提供器证实已经通过了身份验证,则立即将状态调整到状态二,并通知所有订阅身份状态变化的Handler。如果是状态二或状态三,则立即与会话的实际身份状态进行比对。会话实际的身份状态可以通过查询HttpContext.User来获得。如果二者不同,则根据情况调整表中所记录的状态,并向订阅身份变化的Handler发出相应的通知。

  有一个问题是:会话列表的查询频度非常高,每次Request都不可避免查询一次。所以这里对算法的选择要求较高。我在实际的项目中选择了字符串数组的BinarySearch算法。这样每次添加或删除新的会话时不可避免对字符串在数组中的位置进行调整,以保持排序状态。当然,在比对过程中也需要根据命中率调整比对顺序,例如三种状态中,显然状态二的比例最高(当然数组往往也最庞大),应该优先选择。

  最后的解决方案是:只用了三个接口,一个HttpModule和几个内部类就实现了,完全不必修改global.cs,且没有任何输出类供登录认证模块调用,所有的SSO提供器也只需要通过web.config来配置,对业务层是完全透明的。这三个接口是:一个配置参数上下文接口、一个SSO提供器接口(同时兼做捕捉身份状态变化的Handler接口)、一个Handler接口的工厂接口(以保持Handler接口的构造器自由以及决定是否建立Handler接口的实现类实例)。

时间: 2024-10-21 06:59:00

在ASP.NET应用程序中捕捉身份验证状态的变化的相关文章

[.NET 基于角色安全性验证] 之五:跨应用程序进行 Forms 身份验证

ASP.NET 支持在分布式环境中(跨单个服务器上的多个应用程序或在网络场中)进行 Forms 身份验证.如果启用了跨多个 ASP.NET 应用程序的 Forms 身份验证,则当用户在应用程序之间切换时,不需要对他们重新进行身份验证. 要配置跨应用程序的 Forms 身份验证,请在 forms 和 machineKey 配置节中设置若干属性,以便值对于参与共享 Forms 身份验证的所有应用程序都是相同的. 下面的示例演示了 Web.config 文件的 Authentication 节.除非另

【记录】ASP.NET MVC 4/5 Authentication 身份验证无效

原文:[记录]ASP.NET MVC 4/5 Authentication 身份验证无效 在 ASP.NET MVC 4/5 应用程序发布的时候,遇到一个问题,在本应用程序中进行身份验证是可以,但不能和其他"二级域名"共享,在其他应用程序身份验证,不能和本应用程序共享,示例代码: System.Web.Security.FormsAuthentication.SetAuthCookie("蟋蟀", true); webconfig 配置如下: <system.

ASP .NET 中的身份验证:.NET 安全性指导

安全|安全性 摘要本文讨论了设计服务器应用程序时考虑安全性的重要性.Internet Information Services 和 ASP .NET 均提供了安全模型,以便您对用户进行适当的身份验证,并在应用程序中获得正确的安全环境. -------------------------------------------------------------------------------- 目录简介安全性考虑IIS 和 ASP .NET 之间的关系身份验证方法Web 服务的安全性代码访问安全

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

先仔细阅读这段内容:ASP.NET 支持在分布式环境中(跨单个服务器上的多个应用程序或在网络场中)进行 Forms 身份验证. 之前研究过多站点间的Session共享的问题,这里说下跨应用程序进行 Forms 身份验证详细实现方式,此方案的基础就是"跨应用程序进行 Forms 身份验证"(帮助可点击链接或是自己直接查找MSDN). 在VS2005中建立两个Web应用程度的项目,两个项目都添加一个Default.aspx页面,其中一个项目增加Login.aspx页面,实现"Fo

也谈ASP.NET 中的身份验证

一.配置安全身份验证模式 在Web.config 文件中,通过 <authentication> 节可以配置 ASP.NET 使用的安全身份验证模式,以标识传入的用户. <authentication mode="[Windows|Forms|Passport|None]"><forms>...</forms><passport/></authentication> <authentication> 节

一起谈.NET技术,也谈ASP.NET 中的身份验证

一.配置安全身份验证模式 在Web.config 文件中,通过 <authentication> 节可以配置 ASP.NET 使用的安全身份验证模式,以标识传入的用户. <authentication mode="[Windows|Forms|Passport|None]"> <forms>...</forms> <passport/> </authentication> <authentication>

也谈“.NET研究”ASP.NET 中的身份验证

一.配置安全身份验证模式 在Web.config 文件中,通过 <authentication> 节可以配置 ASP.NET 使用的安全身份验证模式,以标识传入的用户. <authentication mode="[Windows|Forms|Passport|None]"> <forms>...</forms> <passport/> </authentication> <authentication>

asp.net中的身份验证

asp.net asp.net中的身份验证 我用的是基于窗体的验证,这也是最常用的,我只写一下摘要,源代码太长,但应该不影响理解代码. web.config的修改:<authentication mode="Forms" /> 用户的登陆验证方法,:这里有两个输入控件的,一个是user_tb,用来输入用户,一个是psw_tb,用来输入密码private void Button1_Click(object sender, System.EventArgs e){//用户登陆验

ASP.Net:基于Windows的身份验证

asp.net|window 如果将 ASP.NET 配置为使用 Windows 身份验证,则 IIS 使用配置的 IIS 身份验证机制执行用户身份验证.启用Windows身份验证的步骤如下:     (1) 配置 Web.config文件.     <authentication mode="Windows" />     (2) 首先启动系统的Internet 信息服务(IIS),右击网站本目录的节点,选择[属性]命令.如图12.3所示. 图12.3 启动IIS (3)