Asp.net MVC阻止用户在某些条件下访问整个应用程序

时间:2012-05-04 16:01:13

标签: asp.net asp.net-mvc asp.net-mvc-3

我有一个网站,其中包含例如页面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条件太多了。我怀疑随着形式复杂性的增加,这种情况会增加。

是否有更好的方法来强制用户不访问网站上的任何其他页面,除非手续已完成?

感谢您的时间。

3 个答案:

答案 0 :(得分: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角色。因此,当他们再次采取行动时,他们将被允许访问。

答案 1 :(得分:0)

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

检查此link以获取样本

答案 2 :(得分:0)

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