Asp.net mvc MVC 5:扩展授权以重定向到操作

Asp.net mvc MVC 5:扩展授权以重定向到操作,asp.net-mvc,authorization,Asp.net Mvc,Authorization,我试图锁定已通过身份验证但在其配置文件页特定控制器/操作中未处于活动状态的用户。通过active,我的意思是授权过程需要检查数据库,以查看帐户是否仅在包含布尔数据的列中处于活动状态 这就是我尝试过的: 然而,这是进入一个循环 这个想法是: 如果已验证且处于活动状态=显示控制器/操作。 如果未验证=显示登录页表单验证 如果已验证且未激活=显示配置文件页面 public class CustomAuthorize : AuthorizeAttribute { private ISADietR

我试图锁定已通过身份验证但在其配置文件页特定控制器/操作中未处于活动状态的用户。通过active,我的意思是授权过程需要检查数据库,以查看帐户是否仅在包含布尔数据的列中处于活动状态

这就是我尝试过的: 然而,这是进入一个循环

这个想法是: 如果已验证且处于活动状态=显示控制器/操作。 如果未验证=显示登录页表单验证 如果已验证且未激活=显示配置文件页面

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);            
        }
    }

请找到下面的链接,这将有助于解决您的问题

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

[CustomAuthorize]
    public class SADietController : Controller
与此相反:

[CustomAuthorize, Authorize]
    public class SADietController : Controller

全部排序

当没有用户登录时,filterContext.HttpContext.User.Identity.Name应引发NullReferenceException。很抱歉,此行实际上没有用处。忘记删除ITI如果您删除了它,如何查询数据库以查看用户是否设置了标志?它仅在用户经过身份验证后使用,因此字符串user不会为空!然而,这实际上不是主要问题。我认为整个事情都错了。你知道我想要实现什么吗?嗨,杰,谢谢你的链接,但是我已经看到了你建议的至少5个链接。我是否为了实现我的需求而凌驾于正确的事情之上?你明白我需要什么吗?谢谢