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

Dar*_*ght 11 c# asp.net-mvc asp.net-identity

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

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

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

_authenticationManager.User.Identity.IsAuthenticated;
Run Code Online (Sandbox Code Playgroud)

_authenticationManager 在这儿:

private IAuthenticationManager _authenticationManager
{
    get
    {
        return _httpContext.GetOwinContext().Authentication;
    }
}
Run Code Online (Sandbox Code Playgroud)

_httpContext被传递到我的identityProvider类的构造函数中.

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

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

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

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

Tom*_*mmy 15

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

  1. 您在web.config中设置了一些内容,包括登录页面所在的位置,登录有多长时间以及是否使用滑动过期(如果用户在您的站点上处于活动状态,则应该延长时间)

  2. 用户来到您的网站,输入他们的用户名和密码.

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

  4. cookie的内容包括用户名和登录的到期日期等项目.

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

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

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

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

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