1

我想在 ASP.NET 网站上实现表单身份验证,该站点应在数据库上寻找用户以获取一些数据,然后针对 LDAP(Active Directory)进行身份验证以验证用户/密码组合。

之后,我需要保留一个代表用户的类实例,以便以各种形式使用它。

我之前尝试使用登录控件来执行此操作,该控件检查先前的条件并执行AuthenticateEventArgs.Authenticated = true并将对象放置在会话中:Session ["user"] = authenticatedUser;但是我在同步它们时遇到了问题(会话在 auth cookie 之前过期,并且当页面出现 NullReferenceExceptions试图使用现已失效的会话对象)。

实现这一目标的最佳方法是什么?有什么方法可以将会话超时与 cookie 寿命同步?用户对象应该以任何其他方式保存?我错过了重点吗?

更新:我不能使用 Windows 身份验证提供程序,因为该站点应该可以从外部网络访问。

4

3 回答 3

1

我将使用 Windows 身份验证作为主要的身份验证提供程序,但使用我自己的简单数据库持久性来获取用户信息。

您的会话方法可以工作,您可以在 IIS 中调整会话超时并将其与身份验证 cookie 超时相匹配。

此外,您可以在 HTTPModule 中执行类似的操作来捕获也清除会话的边缘情况(应用程序池回收等)

伪代码:

if (session["user"] == null)
{
    Authentication.SignOut();
}

这将强制用户进行身份验证。

于 2008-10-15T22:29:33.797 回答
0

我将会话和身份验证 cookie 超时值设置为相同的值。我为我的身份验证 cookie 使用滑动窗口。我还养成了一个习惯,即在尝试使用它们之前,永远不要假设我从会话中得到的值是非空的。我经常将所有会话功能抽象到一个代理类中,该代理类包含我存储在会话中的值的强类型属性。错误会话数据的错误处理在代理中本地化。

于 2008-10-16T00:09:38.507 回答
0

在会话中存储用户信息可以正常工作。要同步会话超时和身份验证 cookie 超时,只需编辑您的 web.config:

<sessionState timeout="XX" />
<authentication mode="Forms">
  <forms loginUrl="Login.aspx" timeout="XX" />
</authentication>

这两个值都以分钟为单位。

每次从 Session 获得值时测试 null !

于 2008-10-17T08:45:15.627 回答