首页 > 解决方案 > 如何在特定条件下将用户重定向到特定页面

问题描述

我正在创建一个 ASP.NET MVC 5,这是一个使用 Active Directory 对用户进行身份验证的 Intranet。

如果它不是特定 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是空的

请让我知道无需实现自定义授权属性的简单方法是什么。

标签: asp.net-mvcasp.net-mvc-5

解决方案


您可以创建一个ActionFilterOnActionExecuting并在执行操作之前触发的方法中检查用户访问权限。

我不确定你是如何实现你的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方法上注册它。


推荐阅读