0

我需要验证经过身份验证的用户是否拥有我网站的有效成员资格。例如,如果用户的会员资格有效,他们可以自由浏览网站的“仅限会员”区域,而如果他们的会员资格无效或过期,他们会自动重定向到网站的计费区域。他们只能查看某些受限页面。

我正在考虑通过将用户的会员资格到期日期存储在 FormsAuthentication cookie 中来解决此问题。我正在使用自定义 MembershipProvider 并且已经将用户 ID 存储在 cookie 中,所以这很容易做到。身份验证 cookie 设置为 24 小时后过期。然后我会使用 custom 检查他们的会员资格是否处于活动状态AuthorizeAttribute,如下所示:

public class MembershipAuthorizeAttribute : AuthorizeAttribute
{
    private readonly bool authorizeMembership;

    public MembershipAuthorizeAttribute()
    {
        this.authorizeMembership = true;
    }

    public MembershipAuthorizeAttribute(bool authorizeMembership)
    {
        this.authorizeMembership = authorizeMembership;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (this.authorizeMembership)
        {
            // Code to validate the membership hasn't expired
        }

        return base.AuthorizeCore(httpContext);
    }
}

然后我可以像这样装饰我的控制器:

[MembershipAuthorize]
public class ActiveMembersController : Controller
{
    // Only users with an active membership can access this controller
}

[MembershipAuthorize(false)]
public class BillingController : Controller
{
   // All members can access this controller
}

这是一种很好的方法,还是有一种更简洁/更可取的方法来验证用户的会员资格是否处于活动状态?我宁愿不必为了检索用户的会员资格到期日期或状态而不必在每个请求上都访问数据库,这就是我想将此值存储在 cookie 中的原因。另外,是否可以将此值存储在 FormsAuthentication cookie 中,还是应该将其存储在不同的 cookie 中?

4

2 回答 2

0

我会以不同的方式处理这个问题。我将有一个后台进程来检查即将到期的会员资格并禁用这些帐户。

如果用户尝试登录,我会检查该帐户是否被禁用,然后采取行动。

于 2013-09-27T05:24:39.540 回答
0

将这些信息存储在 cookie 中并不是我认为的正确方法。正如这个答案https://stackoverflow.com/a/706874/2168278中指出的那样,原因是 cookie 存储在客户端的机器中。所以它们有可能被篡改。

将此信息存储在数据库中似乎更合适。如果您担心性能,您可以随时缓存您的查询。

于 2013-09-27T05:07:59.993 回答