如何在特定条件下将用户重定向到特定页面

How to redirect user to specific page in certain condition

我正在创建一个 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 class 以及您将如何访问它,但是在 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 方法上注册它。