Asp.net mvc 3 MVC 3表单身份验证和禁用的用户帐户
我注意到,如果用户仍然登录或拥有持久cookie,即使他在数据库中被“禁止”或禁用(用户表标志),用户仍然可以访问所有内容,直到cookie消失或用户注销站点。大担保权 所以我准备了一个ActionFilterAttribute来检查这一点,让我不安的是,我必须为每个应用了ActionFilterAttribute的控制器访问数据库。一定有更好的方法,但我还没有找到 任何想法都会很棒 一定有更好的方法,但我还没有找到Asp.net mvc 3 MVC 3表单身份验证和禁用的用户帐户,asp.net-mvc-3,Asp.net Mvc 3,我注意到,如果用户仍然登录或拥有持久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)。当然,根据您的设置,这可能不会使它更干净。