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

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

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

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

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

有帮助吗?

解决方案

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

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

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

伪代码:

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

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

其他提示

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

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

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

两个值均以分钟为单位。

每次从会话中获取值时都测试 null!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top