【问题标题】:MVC 5: extending Authorization to redirect to an actionMVC 5:扩展授权以重定向到操作
【发布时间】:2014-04-17 16:16:17
【问题描述】:

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

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

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

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

【问题讨论】:

  • filterContext.HttpContext.User.Identity.Name 应该在没有用户登录时抛出 NullReferenceException
  • 对不起,这条线其实没用。忘了摆脱它
  • 如果去掉了,怎么查询数据库看用户是否设置了flag?
  • 它仅在用户通过身份验证时使用它,因此字符串用户不会为空!
  • 然而,这实际上不是主要问题。我相信整个事情都是错误的。你明白我想要达到的目标了吗?

标签: asp.net-mvc authorization


【解决方案1】:

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

[CustomAuthorize]
    public class SADietController : Controller

而不是这个:

[CustomAuthorize, Authorize]
    public class SADietController : Controller

全部排序!

【讨论】:

    【解决方案2】:
    猜你喜欢
    • 2019-02-12
    • 1970-01-01
    • 2021-07-22
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    相关资源
    最近更新 更多