ASP.NET MVC对不存在的用户进行身份验证和授权

Mat*_*cks 5 asp.net asp.net-mvc asp.net-membership simplemembership

我正在使用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似乎在这种情况下,很没用.我可以删除用户的帐户,他或她不受影响.如果我错了,应该采取哪些不同的做法?

Chu*_*way 1

将会出现一个小窗口,如果用户被删除并且他们仍然登录,他们仍然可以访问该网站。由于大多数操作都需要验证用户 ID,因此您可以简单地抛出异常并注销用户。

通常数据库不会在每次构建时被破坏,所以我猜测这不是 SimpleMembership 编码的用例。您当然可以检查这一点。我将做出另一个假设,即当您重建站点并部署新数据库时,您不会关闭浏览器。在现实世界中,这些事情不会发生。数据库永远不会消失,用户 ID 也永远不会丢失。

通常,一旦您登录用户,此后的任何时间都不会对该用户进行身份验证(除非他们已注销或会话已过期)。这就是登录点。身份验证 cookie 表明身份验证已发生且成功。未来的假设是用户可以访问您的网站并且无需重新进行身份验证。

  • 好吧,我认为 IsAuthenticated 方法应该像这样工作: 1. 检查 cookie 值 2. 查询数据库中的用户 id 3. 返回用户是否拥有身份验证 cookie 并且存在。看来我是唯一一个对当前版本有问题的人。:) (2认同)