我需要使用表单身份验证设置Asp.Net应用程序,以使其符合以下条件:
我相信第一个可以在web.config中完成:
<authentication mode="Forms">
<forms loginUrl="Login.aspx" timeout="15" slidingExpiration="true"/>
</authentication>
但是你如何解决第二个要求?
答案 0 :(得分:2)
我认为ASP.Net中的表单auth并没有内置任何东西来处理这个问题。
您可以创建一个全局应用程序类(global.asax),处理Session_Start事件,并将日期/时间存储在会话变量中,如下所示:
public void Session_Start(object s, EventArgs e)
{
Session["LoginDate"] = DateTime.Now;
}
然后,您可以处理OnBeginRequest事件以检查会话变量与当前日期/时间之间的差异:
public void Application_OnBeginRequest(object s, EventArgs e)
{
if (Session["LoginDate"] != null)
{
var loginDate = (DateTime)Session["LoginDate"];
if ((DateTime.Now - loginDate).TotalHours >= 24)
{
Session.Abandon();
Response.Redirect("~/Login.aspx");
}
}
}
要处理OnBeginRequest事件,您可能需要创建自定义HttpModule - 请参阅此处: http://msdn.microsoft.com/en-us/library/ms227673(VS.85).aspx
答案 1 :(得分:2)
详细的article on MSDN解释了Forms身份验证的工作原理以及可用的配置选项。
基本上,表单身份验证使用cookie(除非您明确告诉它不要)。因此,您可以将Forms身份验证cookie的到期日期设置为24小时。但是有一个问题。您可能需要滚动自己的成员身份代码,因为默认情况下,timeout
元素的forms
属性也用于设置持久性cookie的生命周期。你不希望这样。您需要将Cookie的到期时间设置为24小时。
它的工作方式是在用户登录后,创建Forms身份验证cookie,然后将其与每个请求一起包含在内,直到它过期。 来自链接的文章: 在对用户进行身份验证时,成员资格提供程序的代码与此类似:
if (Membership.ValidateUser(userName.Text, password.Text))
{
if (Request.QueryString["ReturnUrl"] != null)
{
FormsAuthentication.RedirectFromLoginPage(userName.Text, false);
}
else
{
FormsAuthentication.SetAuthCookie(userName.Text, false);
}
}
else
{
Response.Write("Invalid UserID and Password");
}
您可以使用FormsAuthenticationTicket类创建表单身份验证票证:
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
"cookieName",
DateTime.Now,
DateTime.Now.AddHours(24), // value of time out property
false,
String.Empty,
FormsAuthentication.FormsCookiePath);
表单身份验证使用Encrypt方法加密和签署表单身份验证票证:
string encryptedTicket = FormsAuthentication.Encrypt(ticket);
创建cookie:
HttpCookie authCookie = new HttpCookie(
FormsAuthentication.FormsCookieName,
encryptedTicket);
将cookie添加到cookie集合中:
Response.Cookies.Add(authCookie);
这应该是关于它的。
您可能需要推送自己的Cookie,因为默认情况下,您为timeout
指定的forms
属性将用于cookie超时。
所以在你的例子中:
<authentication mode="Forms">
<forms loginUrl="Login.aspx" timeout="15" slidingExpiration="true"/>
</authentication>
Cookie的超时时间也是15分钟。 在您的情况下,更简单的方法可能是使用会话变量处理强制执行的24小时超时。因为如果用户在那段时间内实际处于活动状态,你只会点击它(否则它会从cookie中超时)。因此,如果活动超过24小时,您可以终止会话。
答案 2 :(得分:1)
嗯,作为一个简单的解决方案,你可以使用Cache的超时通知功能作为“提醒”/回调,在创建后24小时放弃会话。
void Session_Start(object sender, EventArgs e)
{
Cache.Add(Session.SessionID,Session,null,DateTime.Now.AddHours(24),
TimeSpan.Zero, CacheItemPriority.High, OnExpireSession)
}
public void OnExpireSession(String k, Object v, CacheItemRemovedReason r)
{
//uhm.. maybe do some checks if the session was already abandoned?
((SessionState)v).Abandon();
}