如何在特定条件下将用户重定向到特定页面
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
方法上注册它。
我正在创建一个 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
方法上注册它。