如何重定向所有页面在我的mvc asp.net web应用程序除了一个角色

本文关键字:应用程序 web 角色 一个 net asp 重定向 mvc 我的 | 更新日期: 2023-09-27 18:16:10

我使用asp.net c# mvc框架。我需要一种方法来"关闭"我的web应用程序的所有用户除了管理员(即所有的页面应该返回类似于"应用程序是关闭"的所有角色除了Admin)。

我已经创建了一个按钮,以便在数据库中保存web应用程序的状态(开/关)。

我必须在每一页检查申请的状态吗?除了一个角色之外,是否可以有全局重定向?

我不知道如何正确地做这个全局闭包。

如何重定向所有页面在我的mvc asp.net web应用程序除了一个角色

我可以想到三种方法来检查和执行重定向

  1. 连接到适当的授权后事件的HttpModule。推测为HttpApplicationPostAuthorizeRequest

  2. 在您的"全局"(Global.aspx.cs)中订阅相同的事件

  3. 一个MVC动作过滤器,覆盖OnActionExecuting。(确保你使它全局,以避免需要应用到每个控制器:添加到Application_StartGlobalFilters.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