如何重定向所有页面在我的mvc asp.net web应用程序除了一个角色
本文关键字:应用程序 web 角色 一个 net asp 重定向 mvc 我的 | 更新日期: 2023-09-27 18:16:10
我使用asp.net c# mvc框架。我需要一种方法来"关闭"我的web应用程序的所有用户除了管理员(即所有的页面应该返回类似于"应用程序是关闭"的所有角色除了Admin)。
我已经创建了一个按钮,以便在数据库中保存web应用程序的状态(开/关)。
我必须在每一页检查申请的状态吗?除了一个角色之外,是否可以有全局重定向?
我不知道如何正确地做这个全局闭包。
我可以想到三种方法来检查和执行重定向
-
连接到适当的授权后事件的
HttpModule
。推测为HttpApplication
的PostAuthorizeRequest
-
在您的"全局"(
Global.aspx.cs
)中订阅相同的事件 -
一个MVC动作过滤器,覆盖
OnActionExecuting
。(确保你使它全局,以避免需要应用到每个控制器:添加到Application_Start
的GlobalFilters.Filters
)
是MVC的一部分,但是在管道中要晚得多(将完成更多的工作,当过滤器失败时将被丢弃)。
模块的使用由配置控制,这将使其更容易打开和关闭。
选项2可能是最容易实现的,但我更倾向于1提供的模块化。
您可以在自定义过滤器的帮助下完成您的需求,如下所示:-
[CheckUserRole]
public class YourController : Controller
{
public ActionResult YourAction()
{
}
}
public class CheckUserRoleAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Get the User Id from the session
// Get Role associated with the user (probably from database)
// Get the permission associated with the role (like Read, write etc)
// if user is not authenticated then do as :
filterContext.Result = new RedirectToRouteResult(new
RouteValueDictionary(new { controller = "Error", action = "AccessDenied" }));
}
}
是否尝试了actionfilterattribute ?
下面是一个基本的例子:
你的控制器:
[IsAdmin]
public class YourController
{
}
你的属性
public class IsAdminAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if () // Check that your user is not an Admin and that your application is "turn-off"
{
filterContext.Result = new HttpStatusCodeResult(403); // or whatever you want
}
}
}
将[IsAdmin]添加到所有控制器的顶部
你可以在所有其他的控制器中这样写:
public class HomeController : Controller
{
public ActionResult Index()
{
if (User.IsInRole("Administrator"))
return RedirectToAction("PagetoRedirect");
else
return RedirectToAction("CommonPagetoShowApplicationAsClosed");
}
}
或
动作过滤器,你可以自己创建,并寻找命名的动作,如IndexRolename