ASP.Net - 用于特定安全问题的表单身份验证设置

时间:2009-10-14 13:12:57

标签: asp.net forms-authentication

我需要使用表单身份验证设置Asp.Net应用程序,以使其符合以下条件:

  1. 用户应在15分钟不活动后退出
  2. 用户应在24小时后退出,无论活动如何
  3. 我相信第一个可以在web.config中完成:

    <authentication mode="Forms">
      <forms loginUrl="Login.aspx" timeout="15" slidingExpiration="true"/>
    </authentication>
    

    但是你如何解决第二个要求?

3 个答案:

答案 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();
}