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

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

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

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

_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,而不是实际查看数据库。 它是否正确?

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

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

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

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

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

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

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

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

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

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

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