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

问题描述 投票:0回答:1

我正在创建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为空

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

asp.net-mvc asp.net-mvc-5
1个回答
0
投票

您可以创建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方法注册它。

© www.soinside.com 2019 - 2024. All rights reserved.