即使删除用户,ASP.Net Identity Identity.IsAuthenticated仍然是正确的

时间:2014-01-21 19:53:16

标签: c# asp.net-mvc asp.net-identity

我在遵循示例代码后实现了ASP.Net Identity: https://github.com/rustd/AspnetIdentitySample

在我的实现中,我检查用户是否经过身份验证 - 这是从我的MVC控制器上的FilterAttribute调用的;这个想法是我想确认他们在提供页面之前仍然被授权。

因此,在我的过滤器中,最终会调用以下代码:

_authenticationManager.User.Identity.IsAuthenticated;

_authenticationManager在这里:

private IAuthenticationManager _authenticationManager
{
    get
    {
        return _httpContext.GetOwinContext().Authentication;
    }
}

_httpContext传递给我的identityProvider类的构造函数。

现在 - 我登录后,_authenticationManager.User.Identity.IsAuthenticated;按预期返回true

但是,在开发过程中,我倾倒并重新播种了我的数据库,而没有添加用户。如此有效,我删除了IdentityUser - 但_authenticationManager.User.Identity.IsAuthenticated; STILL返回true

知道为什么会这样吗?我只能假设它以某种方式检查cookie,而不是实际查看数据库。它是否正确?

或者我搞砸了我的实施......

1 个答案:

答案 0 :(得分:15)

这不会使IsAuthenticated成为安全漏洞。我们来看看实际的身份验证过程。

  1. 您在web.config中设置了一些内容,包括登录页面的位置,登录有多长时间以及是否使用滑动过期(如果用户在您的位点)

  2. 用户访问您的网站,输入用户名和密码。

  3. 该信息将发布到您的服务器。您获取该信息,验证它是否正确(验证)。如果它是正确的,服务器会发出一个称为FormsAuthenticationTicket 注意的加密cookie - 这可能在新标识中有不同的名称,但原理相同。

  4. Cookie的内容包括用户名和登录的截止日期等项目。

  5. 在每个请求中,服务器查看cookie集合以获取身份验证cookie。如果找到,它会对其进行解密,读取值并确定它是否仍然是有效的cookie(到期时间)。一旦它拥有来自cookie的用户信息,服务器就可以使用此信息来确定用户是否有权获得所请求的资源(通过用户名查找)。

  6. 5a上。如果cookie不存在或已过期,则会将用户重定向回登录页面。

    6.当用户注销时,cookie将从cookie集合中删除。现在,如果用户尝试转到仅供授权用户使用的资源,则服务器将在上面的5a处结束。

    因此,在您的情况下,您手动删除了用户。这并不会改变此用户之前使用仍然有效的cookie进行身份验证的事实。因此,IsAuthenticated返回预期值。在更改用户状态之前,用户已经过身份验证。 IsAuthenticated并不意味着,此用户在我的数据库中是否仍然有效。

    如果您要运行一个不断删除/停用用户的站点,请覆盖OnRequestAuthorization的{​​{1}}方法,查看用户是否确实在数据库中。另请注意,如果用户名不存在(因为您已将其删除),则对role / userId的任何查找都将失败。您可以捕获该异常/失败并返回属性未经授权的响应。