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

时间:2013-04-14 16:44:38

标签: 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.IsAuthenticatedUser.Identity.IsAuthenticated似乎毫无用处。我可以删除用户的帐户,他或她不受影响。如果我错了,应该做些什么?

6 个答案:

答案 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="" />