Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 MVC 3表单身份验证和禁用的用户帐户_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc 3 MVC 3表单身份验证和禁用的用户帐户

Asp.net mvc 3 MVC 3表单身份验证和禁用的用户帐户,asp.net-mvc-3,Asp.net Mvc 3,我注意到,如果用户仍然登录或拥有持久cookie,即使他在数据库中被“禁止”或禁用(用户表标志),用户仍然可以访问所有内容,直到cookie消失或用户注销站点。大担保权 所以我准备了一个ActionFilterAttribute来检查这一点,让我不安的是,我必须为每个应用了ActionFilterAttribute的控制器访问数据库。一定有更好的方法,但我还没有找到 任何想法都会很棒 一定有更好的方法,但我还没有找到 不,没有。很抱歉如果禁用/禁止用户的概念只存在于您的数据库中,那么除了攻击您的

我注意到,如果用户仍然登录或拥有持久cookie,即使他在数据库中被“禁止”或禁用(用户表标志),用户仍然可以访问所有内容,直到cookie消失或用户注销站点。大担保权

所以我准备了一个ActionFilterAttribute来检查这一点,让我不安的是,我必须为每个应用了ActionFilterAttribute的控制器访问数据库。一定有更好的方法,但我还没有找到

任何想法都会很棒

一定有更好的方法,但我还没有找到


不,没有。很抱歉如果禁用/禁止用户的概念只存在于您的数据库中,那么除了攻击您的数据库之外,没有其他方法。ASP.NET仅验证在每个请求上发送的身份验证cookie的有效性。它甚至不知道被禁用的用户意味着什么,所以你不能期望它做的比它已经做的更多。

有几个选项:

1) 您可以通过挂接会话开始来验证用户身份验证是否有效。这样,如果用户具有持久cookie,则可以验证用户名,并在需要时使cookie过期


2) 您可以使用基于时间的机制每隔几次请求(每5分钟或任何时间)检查用户身份验证状态。您可以使用
UserData
字段将
lastChecked
时间戳值存储在用户会话中或auth cookie本身中。这允许您重新检查用户身份验证cookie是否需要更频繁地过期,但将数据库调用保持在最低限度。

MyThis是我提出的解决方案:

在用户帐户成员资格服务中添加一个函数,返回用户帐户是否仍处于活动状态

public class UserAccountMembershipService : IMembershipService
{        
    public bool UserIsActive(Guid userId)
    {
        if (userId == new Guid()) throw new ArgumentException("Value cannot be null or empty.", "userName");
        MembershipUser user = _provider.GetUser(userId, true);
        return user.IsApproved;
    }
}
按如下方式重写authorized属性:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        IMembershipService membershipService = new UserAccountMembershipService();

        //Check to see if the user's account is still active
        bool isActive = false;
        if (httpContext.User.Identity.IsAuthenticated)
        {
            Guid userId = (Guid)Membership.GetUser(httpContext.User.Identity.Name).ProviderUserKey;
            isActive = membershipService.UserIsActive(userId);
        }

        if (!isActive)
        {
            //If the user's account is no longer active log him/her out
            IFormsAuthenticationService FormsService = new FormsAuthenticationService();
            FormsService.SignOut();
        }
        //Call the base AuthorizationCore method
        return base.AuthorizeCore(httpContext) && isActive;
    }
}

嘿,达林,很高兴再次收到你的来信,先生。。创建一个禁用帐户的数据集并缓存它怎么样?每次用户被标记时,我都会使缓存无效。。。只是一个想法。然后过滤器可以检查它,而不是点击数据库。@CrazyCoderz,当然,将这些信息存储在内存中是一种解决方案。但要小心,如果您的应用程序非常成功,并且您开始拥有数百万用户(这就是我所希望的),您可能会遇到问题。更不用说将这些信息存储在内存中意味着您不能再在web场中运行,因为两个节点不会共享相同的内存。这意味着用户可以在一台web服务器上完全有效,而在另一台web服务器上完全禁用。所以,如果你这样做的话,一定要非常小心,并确保同步缓存。如果缓存有持久的cookie,身份验证将始终有效。我尝试了类似的方法,这就是我所注意到的。我不是说检查auth cookie,我是说访问数据库或其他任何东西并检查标志。如果被禁止或禁用,则使身份验证cookie过期。啊,好的。是的,这就是我目前使用过滤器所做的,我不喜欢使用属性注入将我的存储库放入过滤器,但它可以工作。是的,属性总是有点混乱。我很想把它移到授权过程中(httpmodule或global)。当然,根据您的设置,这可能不会使它更干净。