5

我正在使用DropCreateDatabaseAlways初始化程序,因此每次启动应用程序时我的数据库都会被破坏(至少我希望如此)。有趣的是我仍然认为自己已登录。我通过了Authorize属性并且可以做危险的事情。这可能是因为之前测试的剩余 cookie。

我的应用程序的注册/登录部分是未触及的 MVC 4 Internet 应用程序模板。ASP.NET 不应该根据保存在数据库中的用户检查 cookie 值吗?WebSecurity.IsAuthenticated返回 true 并WebSecurity.CurrentUserName返回名称。唯一按预期工作的是WebSecurity.CurrentUserId返回-1。我是新手,所以我只能猜测这是因为UserId没有存储在 cookie 中,必须从数据库中检索。

我对吗?如果是这样,这是否意味着我应该始终使用WebSecurity.CurrentUserId来确定用户是否已登录?WebSecurity.IsAuthenticated在那种情况下User.Identity.IsAuthenticated似乎毫无用处。我可以删除用户的帐户,他或她不受影响。如果我错了,应该怎么做?

4

6 回答 6

1

只要身份验证会话保持打开状态(即浏览器现在关闭),会话 cookie 就保持活动状态,并且 MVC 假定用户仍然有效。

FormsAuthentication.LogOff()如果用户已通过身份验证 ( User.Identity.IsAuthenticated == true) 并且 UserTable ( ) 中没有有效用户,则使用删除 cookie WebSecurity.CurrentUserId == -1

于 2013-04-19T10:50:19.943 回答
1

我有同样的问题,但通过在 Authorize 属性中指定所需的角色来解决它。一旦您这样做,它就会开始访问数据库并失败并出现“用户不存在”错误,这正是您想要的。

[Authorize(Roles = "Customer")]
public class DashboardController : Controller
于 2013-07-07T09:39:17.893 回答
1

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

通常数据库不会在每次构建时都被吹走,所以我猜这不是 SimpleMembership 编码的用例。你当然可以检查这个。我将假设您在重建站点并部署新数据库时没有关闭浏览器。在现实世界的场景中,这些事情不会发生。数据库永远不会被吹走,用户 ID 永远不会丢失。

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

于 2013-04-14T17:18:30.733 回答
1

如果你想真正地检查一个用户是否没有被删除,你只需要查阅数据库。

请注意,用户和管理员同时工作。这意味着用户可以在他通过身份验证后的一秒钟内被删除。一个 cookie 甚至可以是一两秒(!),并且用户可能刚刚被删除。

在最悲观的情况下,用户输入有效的用户名和密码并成功登录并在一个请求后得到“对不起,您的帐户已被删除”(因为该帐户实际上刚刚被删除)。

于 2013-04-14T17:24:13.620 回答
0

在正常情况下,添加Session.Abandon();到您的LogOff操作AccountController中将完成清除会话的工作:

public ActionResult LogOff()
{
    FormsAuthentication.SignOut();
    Session.Abandon();

    return RedirectToAction("Index", "Home");
}

所以我认为你可以尝试添加Session.Abandon();初始化代码,DropCreateDatabaseAlways每次都用来清除会话。

于 2013-04-14T17:18:45.130 回答
0
  • 票证发行时间通常在身份验证 cookie 中加密,然后如果自登录后超过 X 时间,您可以使用它来要求对敏感区域(收件箱/计费等)重新进行身份验证。

  • 如果您坚持在应用程序更改(即数据库/配置)时使所有当前身份验证票证无效,您可以在您的web.config

    <machineKey validationKey="..." decryptionKey="" />
    
于 2013-04-14T17:32:21.083 回答