我试图锁定在其配置文件页面(特定控制器/操作)中已通过身份验证但未处于活动状态的用户。通过激活,我的意思是授权过程需要检查数据库以查看帐户是否处于活动状态(只是具有布尔数据的列)。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);
}
}
'filterContext.HttpContext.User.Identity.Name'应该在没有用户登录时抛出'NullReferenceException'。 –
对不起,这行实际上是没用的。忘了摆脱它 – WPalombini
如果你摆脱它,你如何查询数据库,看看用户是否有一个标志设置? –