我正在使用DropCreateDatabaseAlways
初始化程序,因此每次启动应用程序时都会销毁我的数据库(至少我希望如此)。有趣的是我仍然认为自己已登录。我通过Authorize
属性并可以执行危险的操作。这可能是因为之前测试的剩余cookie。
我的应用程序的注册/登录部分是未触及的MVC 4 Internet应用程序模板。 ASP.NET不应该检查保存在DB中的用户的cookie值吗? WebSecurity.IsAuthenticated
返回true,WebSecurity.CurrentUserName
返回名称。
唯一按预期工作的是WebSecurity.CurrentUserId
,返回-1。我是新手,所以我只能猜测这是因为UserId
没有存储在cookie中,必须从数据库中检索。
我是对的吗?如果是这样,是否意味着我应该始终使用WebSecurity.CurrentUserId
来确定用户是否已登录?在这种情况下,WebSecurity.IsAuthenticated
和User.Identity.IsAuthenticated
似乎毫无用处。我可以删除用户的帐户,他或她不受影响。如果我错了,应该做些什么?
答案 0 :(得分:1)
将会有一个小窗口,如果用户被删除但他们仍然登录,他们仍然可以访问该网站。由于大多数操作都需要验证用户ID,因此您只需抛出一个激活并将用户注销即可。
通常情况下,数据库不会在每个构建中被吹走,所以我猜这不是SimpleMembership编码的用例。你当然可以检查一下。我将再次假设您在重建站点和部署新数据库时没有关闭浏览器。在现实世界中,这些事情都不会发生。数据库永远不会被吹走,用户ID永远不会丢失。
通常,一旦您登录用户,用户就不会在此后的任何时间进行身份验证(除非他们已注销,或者会话已过期)。这是登录的重点。身份验证cookie表示身份验证已发生且成功。未来的假设是用户可以访问您的站点并且不会重新进行身份验证。
答案 1 :(得分:1)
如果您想要真实地检查用户是否尚未删除,您只需 来咨询数据库。
请注意,用户和管理员同时工作。这意味着用户可以在经过身份验证后一秒钟内删除。一个cookie甚至可以一两秒钟(!),用户可能刚被删除。
在最悲观的情况下,用户键入有效的用户名和密码并成功登录,并在以后只有一个请求(因为该帐户确实已被删除)时“抱歉,您的帐户已被删除”。 / p>
答案 2 :(得分:1)
只要身份验证会话保持打开状态(即浏览器现已关闭),会话cookie就会保持活动状态,MVC会认为用户仍然有效。
如果用户经过身份验证(FormsAuthentication.LogOff()
)并且UserTable中没有有效用户(User.Identity.IsAuthenticated == true
),则使用WebSecurity.CurrentUserId == -1
删除Cookie。
答案 3 :(得分:1)
我遇到了同样的问题,但是通过在Authorize属性中指定所需的角色来解决它。一旦你这样做,它就开始进入数据库并因“用户不存在”错误而失败,这就是你想要的。
[Authorize(Roles = "Customer")]
public class DashboardController : Controller
答案 4 :(得分:0)
在正常情况下,将Session.Abandon();
添加到LogOff
中的AccountController
操作可以完成清算会话的工作:
public ActionResult LogOff()
{
FormsAuthentication.SignOut();
Session.Abandon();
return RedirectToAction("Index", "Home");
}
所以我认为您可以尝试在初始化代码中添加Session.Abandon();
,每次都使用DropCreateDatabaseAlways
清除会话。
答案 5 :(得分:0)
发票时间通常在身份验证Cookie中加密,如果登录后超过X时间,您可以使用它来要求对敏感区域(收件箱/结算等)重新进行身份验证。
如果您坚持在应用程序更改(即数据库/配置)时使所有当前的授权票无效,您可以在web.config
中更改此设置:
<machineKey validationKey="..." decryptionKey="" />