如果用户使用AJAX登录,客户端是否可以安全地询问服务器?

时间:2016-05-22 19:41:38

标签: ajax asp.net-mvc security asp.net-web-api

我希望我的系统显示"会话过期"如果用户空闲,则显示消息。

如果我每隔T秒/分钟向API端点发出一次AJAX呼叫,我会面临哪些安全风险,该端点会检查用户是否经过身份验证?

/// <summary>
/// Used to check if the user was idle and the session expired.
/// </summary>
[Authorize]
public class IdleController : ApiController
{
    /// <summary>
    /// Used by the system to check if the session expired while the user was idle.
    /// If the user is not logged in anymore because of a terminated session, the AuthorizeAttribute will not pass the request to this method.
    /// An HTTP 401 response will be returned, indicating the expiration of the session.
    /// If the session is still active an HTTP 200 will be returned with a null value response.
    /// </summary>
    /// <returns>Always null.</returns>
    public object GetCheck()
    {
        return null;
    }
}

&#13;
&#13;
var idleTimeout;

function StartIdleCheckTimeout()
{
    idleTimeout = setTimeout(CheckIdle, 60000);
}

function CheckIdle()
{
    $.ajax("Api/Idle/Check", {
        statusCode: {
            200: ResetIdleCheckTimeout,
            401: OnUserIdle
        }
    });
}

function ResetIdleCheckTimeout()
{
    clearTimeout(idleTimeout);

    StartIdleCheckTimeout();
}

function OnUserIdle()
{
    alert("Su sesión ha expirado. Por favor ingresa nuevamente.");

    RedirectTo("/");
}
&#13;
&#13;
&#13;

提前致谢, 害羞。

3 个答案:

答案 0 :(得分:0)

除了通常的网络外,我认为你没有任何安全风险。但是你会对js中的异步请求感到很头疼,当你必须使用它们而不是永久连接时,正确处理这些请求会有点棘手。

答案 1 :(得分:0)

没有严重的安全风险。关于这些东西最重要的事情之一是在服务器端会话上存储敏感信息。当您需要访问其中一个信息(例如登录时间戳)时,您需要通过会话ID访问它。

答案 2 :(得分:0)

风险是您的AJAX请求将充当“保持活跃状态​​”,因此如果您的网站在浏览器中打开并且互联网连接处于活动状态,则会话将永不过期。

这可能意味着您的应用程序的安全超时将不再能够防止本地攻击者访问用户的未锁定计算机(目标环境中的问题是由您决定的。)

您可以为会话客户端计时,如果用户没有移动鼠标或按下应用上的键盘一段时间,则可以调用您的注销处理程序。然而,这会增加复杂性,从而降低安全性。

请注意Forms Authentication by default does not expire session server-side upon logout

  

调用SignOut方法只会删除表单身份验证Cookie。 Web服务器不存储有效和过期的身份验证票证以供以后进行比较。如果恶意用户获得有效的表单身份验证cookie,这会使您的站点容易受到重播攻击。要在使用表单身份验证cookie时提高安全性,您应该执行以下操作:

     
      
  • 通过将SlidingExpiration属性设置为false,对表单身份验证Cookie使用绝对过期。这限制了可以重放被劫持cookie的窗口。
  •   
  • 通过将RequireSSL属性设置为true并在SSL下运行整个网站,仅通过安全套接字层(SSL)发出并接受身份验证Cookie。将RequireSSL属性设置为true可确保ASP.NET永远不会通过非SSL连接向浏览器发送身份验证cookie。但是,客户端可能不会遵守cookie上的安全设置。这意味着客户端可能会通过非SSL连接发送表单身份验证cookie,从而使其容易受到劫持。您可以通过在SSL下运行整个网站来阻止客户端以明文形式发送表单身份验证cookie。
  •   
  • 使用服务器上的持久存储来记录用户何时退出网站,然后使用应用程序事件(如PostAuthenticateRequest事件)来确定当前用户是否使用表单身份验证进行身份验证。如果用户使用表单身份验证进行身份验证,并且持久存储中的信息指示用户已注销,请立即清除身份验证cookie并将浏览器重定向回登录页面。成功登录后,更新存储以反映用户已登录。使用此方法时,应用程序必须跟踪用户的登录状态,并且必须强制空闲用户注销。
  •   

因此,您应该实施这些建议以提高安全性。