在Session_End或SignOut(?)中注销Formsauthentication用户

时间:2013-09-19 15:45:11

标签: asp.net vb.net session forms-authentication asp.net-4.0

这是一个webform asp.net 4应用程序。使用Formsauthentication方法。

的web.config:

<sessionState
    mode="InProc"
    cookieless="false"
    timeout="1"/>
 <authentication mode="Forms">
  <forms defaultUrl="~/Default.aspx"
      loginUrl="~/Login.aspx"
      slidingExpiration="true"
      timeout="25" />
</authentication>

问题在于,当用户注销时,我需要执行一些操作(例如,在数据库中记录某些内容)。

用户点击“退出”链接的情况非常简单。

现在我正在处理由于超时导致的注销,我面临两种不同的情况:

  1. 会话过期且授权不
  2. 授权令牌过期且会话仍然有效
  3. 在方案#1中,我尝试了以下方法:

    Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
        If Not String.IsNullOrEmpty(Session("Username")) Then
            Try
                ' custom action..
                FormsAuthentication.SignOut()
                Session.Clear()
                Session.Abandon()
            Catch ex As Exception
                ' log the exception
            End Try
        End If
    End Sub
    

    但是在这里我有两个很大的问题:用户在这种情况下不可用(即,我不能chech User.Identity.isAuthenticated,因此我正在检查Session(“Username”) )和 FormsAuthentication.SignOut()引发nullreferenceException。 如何从FormsAuthentication“区域”中注销用户?

    场景#2更复杂,因为我读到授权过期时没有触发显式事件。我的“愿意”是能够在到期之前为用户执行相同的自定义操作。 是否有可能以某种方式?

    某种自定义身份验证提供程序是否允许我以更好,更健壮的方式处理这些情况?

1 个答案:

答案 0 :(得分:1)

我不知道有哪个自定义提供程序可以更好地处理它,但我过去处理此问题的一种方法是将会话滑动到期时间设置为远高于web.config中的身份验证超时。这样我只有一个场景要处理:丢失身份验证令牌但有效会话。更容易处理它 如果(!User.IsAuthenticated) {...做任何事情然后去登录页面......}

Forms Authentication Timeout vs Session Timeout