asp.net-mvc - 如何在特定条件下将用户重定向到特定页面
问题描述
我正在创建一个 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
是空的
请让我知道无需实现自定义授权属性的简单方法是什么。
解决方案
您可以创建一个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
方法上注册它。
推荐阅读
- php - Laravel custom morph relationship
- firebase-authentication - 将 Firebase 连接到 ionic3 应用程序
- python - openpyxl 从一个工作簿复制到另一个
- android - 在 popupview 对象顶部膨胀图像
- python - 使用 tensorflow:feed_dict,ValueError: 使用序列设置数组元素
- android - Android:RecyclerView 中的处理程序和计时器无法正常工作
- android - 更改 GIT 状态文件颜色 android studio
- assembly - Microblaze,用地址值声明数据数组;
- json - 如何在由 JsonPath 标识的 JSON 字符串中找到行和列?
- jquery - 随机放置的数字,图像悬停