我想在ASP.NET网站上实现表单身份验证,该站点应该在数据库中寻找用户以获取一些数据,然后针对LDAP(Active Directory)进行身份验证以验证用户/密码组合。
之后我需要保留一个代表用户的类实例,以各种形式使用它。
我之前尝试使用登录控件执行此操作,该控件检查以前的条件并执行AuthenticateEventArgs.Authenticated = true
并将对象放在会话中:Session ["user"] = authenticatedUser;
但我在同步这两个问题时遇到了问题(会话在auth cookie之前到期,当页面尝试使用现已解散的会话对象时,我得到了NullReferenceExceptions。)
实现这一目标的最佳方法是什么?有没有办法将会话超时与cookie生命周期同步?用户对象应该以任何其他方式保存?我错过了这一点吗?
更新: 我无法使用Windows身份验证提供程序,因为该网站应该可以从外部访问priate网络。
答案 0 :(得分:1)
我会使用Windows身份验证作为主要身份验证提供程序,但为用户信息添加自己的简单数据库持久性。
您的会话方法可行,您可以调整IIS中的会话超时并将其与身份验证cookie超时匹配。
此外,您可以在HTTPModule中执行类似的操作以捕获也清除会话的边缘情况(应用程序池回收等)
伪码:
if (session["user"] == null)
{
Authentication.SignOut();
}
这会强制用户进行身份验证。
答案 1 :(得分:0)
我将session和auth cookie超时值设置为相同的值。我使用滑动窗口作为我的身份验证cookie。我还习惯于在尝试使用它们之前从不假设我从会话中获取的值是非null。我经常将所有会话功能抽象到代理类中,该代理类包含我在会话中存储的值的强类型属性。错误会话数据的错误处理已在代理中本地化。
答案 2 :(得分:0)
在会话中存储用户信息将正常工作。要同步会话超时和身份验证cookie超时,只需编辑您的web.config:
<sessionState timeout="XX" />
<authentication mode="Forms">
<forms loginUrl="Login.aspx" timeout="XX" />
</authentication>
这两个值都以分钟为单位。
每次从Session获取值时测试null!