1

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

网络配置:

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

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

用户单击“注销”链接的情况非常简单。

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

  1. 会话过期,授权没有
  2. 授权令牌过期,会话仍然有效

在场景 #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

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

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

某种自定义身份验证提供程序是否可以让我以更好、更强大的方式处理这些情况?

4

1 回答 1

1

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

表单身份验证超时与会话超时

于 2013-09-19T16:26:38.127 回答