MVC 5:扩展授权以重定向到操作

时间:2014-03-13 05:42:16

标签: asp.net-mvc authorization

我正在尝试锁定在其个人资料页面中经过身份验证但未激活的用户(特定控制器/操作)。通过激活,我的意思是授权过程需要检查数据库以查看该帐户是否处于活动状态(只是一个包含布尔数据的列)。

这是我尝试过的: 然而,这是一个循环。

这个想法是:     如果已验证且已激活=显示控制器/操作。     如果未经过身份验证=显示登录页面(表单身份验证)     如果经过身份验证且未激活=显示个人资料页面。

public class CustomAuthorize : AuthorizeAttribute
{
    private ISADietRepository repository;
    public CustomAuthorize()
    {
        this.repository = new SADietRepository(new SADietEntities());
    }
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        //base.OnAuthorization(filterContext);

        if (filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            string user = filterContext.HttpContext.User.Identity.Name;
            var result = repository.GetVetClinicByEmail(user);
            if (!result.IsActive)
            {
                filterContext.Result =
                new RedirectToRouteResult(
                    new System.Web.Routing.RouteValueDictionary{{"Controller", "SADiet"},
                                                                {"Action", "NewCustomer"},
                                                                });
            }
        }
        else
        {

                filterContext.Result =
                new RedirectToRouteResult(
                    new System.Web.Routing.RouteValueDictionary{{"Controller", "SADiet"},
                                                                {"Action", "Login"},
                                                                });                                                                
        }
        base.OnAuthorization(filterContext);
    }
}

伙计我刚刚尝试过以下代码。只要用户通过身份验证,它就可以正常运行。如果用户未经过身份验证,则不再请求身份验证,只需在没有用户登录的情况下运行该操作。

public class CustomAuthorize : ActionFilterAttribute
    {
        private ISADietRepository repository;
        public CustomAuthorize()
        {
            this.repository = new SADietRepository(new SADietEntities());
        }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                string user = filterContext.HttpContext.User.Identity.Name;
                var result = repository.GetVetClinicByEmail(user);
                if (!result.IsActive)
                {
                    filterContext.Result =
                    new RedirectToRouteResult(
                        new System.Web.Routing.RouteValueDictionary{{"Controller", "MyAccount"},
                                                                    {"Action", "Profile"},
                                                                    });
                }
            }
            base.OnActionExecuting(filterContext);            
        }
    }

2 个答案:

答案 0 :(得分:0)

我发现了这个问题。 我的第二个代码是正确的。问题是我替换了属性而不是添加新属性来装饰控制器。 我这样做了:

[CustomAuthorize]
    public class SADietController : Controller

而不是:

[CustomAuthorize, Authorize]
    public class SADietController : Controller

全部排序!

答案 1 :(得分:-2)