我有一个网站,其中包含例如页面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条件太多了。我怀疑随着形式复杂性的增加,这种情况会增加。
是否有更好的方法来强制用户不访问网站上的任何其他页面,除非手续已完成?
感谢您的时间。
答案 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自定义每个操作的授权。