2014-03-13 36 views
0

我试图锁定在其配置文件页面(特定控制器/操作)中已通过身份验证但未处于活动状态的用户。通过激活,我的意思是授权过程需要检查数据库以查看帐户是否处于活动状态(只是具有布尔数据的列)。MVC 5:扩展授权重定向到动作

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

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

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

'filterContext.HttpContext.User.Identity.Name'应该在没有用户登录时抛出'NullReferenceException'。 –

+0

对不起,这行实际上是没用的。忘了摆脱它 – WPalombini

+0

如果你摆脱它,你如何查询数据库,看看用户是否有一个标志设置? –

回答

0

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

[CustomAuthorize] 
    public class SADietController : Controller 

,而不是这样的:

[CustomAuthorize, Authorize] 
    public class SADietController : Controller 

所有排序!

-2
+0

嗨周杰伦,感谢您的链接,但我已经看到您建议的至少5个链接。我压倒正确的事情来实现我所需要的吗?你明白我需要什么吗?谢谢。 – WPalombini