1

我有一个网站,例如页面 A、B、C、D、.... 我希望用户在注册后只能访问页面 A。要访问其余页面,用户需要完成一些加入手续,其中包括付款。

现在最简单的方法是在我当前完成的所有页面中添加一个检查,以确保仅在用户完成所有加入手续后才显示请求的页面 B、C、D...。这将需要我重新处理所有现有的页面。此外,所有未来开发的页面都需要记住添加该检查。

为了解决这个问题,我使用了一个从 AuthorizeAttribute 继承的自定义授权属性类,并在那里检查了重写的 OnAuthorization 方法,如下面的代码片段所示

        else if (!SessionCache.FormalitiesCompleted)
        {
            //force completion of formalities
            if (!( string.Equals(filterContext.ActionDescriptor.ActionName, "Index", StringComparison.InvariantCultureIgnoreCase)
                  || string.Equals(filterContext.ActionDescriptor.ActionName, "Options", StringComparison.InvariantCultureIgnoreCase)
                  || string.Equals(filterContext.ActionDescriptor.ActionName, "Index_B", StringComparison.InvariantCultureIgnoreCase)
                  || string.Equals(filterContext.ActionDescriptor.ActionName, "Index_C", StringComparison.InvariantCultureIgnoreCase)
                    && string.Equals(filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, "Formalities", StringComparison.InvariantCultureIgnoreCase)))
            {
                string _action = filterContext.ActionDescriptor.ActionName;
                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Formalities", action = _action, area = "FormalitiesArea" }));
            }


        }

如您所见,IF 中有太多的 OR 条件。我怀疑这会随着手续复杂性的增加而增加。

有没有更好的方法来强制用户在完成手续之前不要访问网站上的任何其他页面?

谢谢你的时间。

4

3 回答 3

2

您可能应该查看[Authorize attribute] http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx如果您使用该属性装饰操作,则只有登录的用户才能访问它,而其他人将重定向到登录页面。

对于付费/注册用户,我将从这里继承并创建一个 PaidUserAuthorize 属性:

public class PaidUserAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if(filterContext.Result is HttpUnauthorizedResult)
        {
            filterContext.Result = new RedirectResult("/PaymentPage");
        }
    }
}

因此装饰一个动作

[PaidUserAuthorize(Roles = "PaidUser", "Super User")]

将未付费用户重定向到付款页面。

用户付费后 - 将他们添加到 PaidUser 角色。因此,当他们再次执行操作时,他们将被允许访问。

于 2012-05-04T16:12:42.803 回答
0

在控制器中使用 [Authorize] 注释怎么样?通过创建自己的AuthorizeAttributes,您应该能够根据您选择使用或创建的任何 MembershipProvider 自定义每个操作的授权。

于 2012-05-04T16:06:42.567 回答
0

您可以创建一个肌动蛋白过滤器并将其应用于您也想限制访问的操作或类。在您的操作过滤器中,您需要覆盖 OnActionExecuting 方法并在其中实现您的检查逻辑。您可以根据自己的意愿允许或拒绝访问这些视图

查看此链接以获取示例

于 2012-05-04T16:05:16.817 回答