我在遵循示例代码后实现了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,而不是实际查看数据库。它是否正确?
或者我搞砸了我的实施......
答案 0 :(得分:15)
这不会使IsAuthenticated
成为安全漏洞。我们来看看实际的身份验证过程。
您在web.config中设置了一些内容,包括登录页面的位置,登录有多长时间以及是否使用滑动过期(如果用户在您的位点)
用户访问您的网站,输入用户名和密码。
该信息将发布到您的服务器。您获取该信息,验证它是否正确(验证)。如果它是正确的,服务器会发出一个称为FormsAuthenticationTicket
注意的加密cookie - 这可能在新标识中有不同的名称,但原理相同。
Cookie的内容包括用户名和登录的截止日期等项目。
在每个请求中,服务器查看cookie集合以获取身份验证cookie。如果找到,它会对其进行解密,读取值并确定它是否仍然是有效的cookie(到期时间)。一旦它拥有来自cookie的用户信息,服务器就可以使用此信息来确定用户是否有权获得所请求的资源(通过用户名查找)。
5a上。如果cookie不存在或已过期,则会将用户重定向回登录页面。
6.当用户注销时,cookie将从cookie集合中删除。现在,如果用户尝试转到仅供授权用户使用的资源,则服务器将在上面的5a处结束。
因此,在您的情况下,您手动删除了用户。这并不会改变此用户之前使用仍然有效的cookie进行身份验证的事实。因此,IsAuthenticated
返回预期值。在更改用户状态之前,用户已经过身份验证。 IsAuthenticated
并不意味着,此用户在我的数据库中是否仍然有效。
如果您要运行一个不断删除/停用用户的站点,请覆盖OnRequestAuthorization
的{{1}}方法,查看用户是否确实在数据库中。另请注意,如果用户名不存在(因为您已将其删除),则对role / userId的任何查找都将失败。您可以捕获该异常/失败并返回属性未经授权的响应。