我正在创建ASP.NET MVC 5,这是一个内部网,使用Active Directory对用户进行身份验证。
如果用户不是特定Active Directory组的一部分,我希望将其重定向到特定视图。我可以在所有控制器和动作中添加以下代码
// AppUser.HasAccess() checked if user is part of specific Active Directory Group and returns bool
if(!AppUser.HasAccess())
{
return RedirectToAction("AccessDenied");
}
但是,我只想在一个或两个地方这样做,而不是在每个地方都散布那段代码。
我试图更改_Layout.cshtml来执行类似的操作,但出现错误,提示我不能跳过调用@RenderBody()
<div class="container body-content">
@if(AppUser.HasAccess())
{
@RenderBody()
}
else
{
@RenderPage("AccessDenied.cshtml")
}
</div>
我也尝试过入侵RouteConfig,但是在那个阶段HttpContext.Current.User
为空
请让我知道无需实现自定义授权属性的简单方法是什么。
您可以创建ActionFilter并使用执行操作前会触发的OnActionExecuting
方法检查用户访问权限。
我不确定您如何实现AppUser
类以及如何访问它,但是在ActionFilter
中您可以访问HttpContext
,如下所示:
public class ValidateAccessFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
var user = filterContext.HttpContext.User;
// verify user permission
}
public void OnActionExecuted(ActionExecutedContext context)
{
// do something after the action executes
}
}
如果您希望上述过滤器在每个请求上执行,那么您可以如下所示在全球范围内注册它:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// global filters
filters.Add(new ValidateAccessFilter());
}
}
否则,您可以使用特定的Controller
或特定的Action
方法注册它。