gpt4 book ai didi

asp.net-mvc - 仅在 ASP.NET MVC 站点的一部分中将操作过滤器应用于每个 Controller ?

转载 作者:行者123 更新时间:2023-12-04 18:54:42 24 4
gpt4 key购买 nike

我看到了一个很好的答案 similar question这解释了,通过从一个用您自己的 ActionFilter 属性装饰的新基类继承所有 Controller ,您可以如何将一些逻辑应用于您网站的所有请求。

我想根据我的用户访问的网站区域找到一种方法。

例如,我将有一个带有 View 操作的 Product Controller ,但我希望允许将其用于以下两个 url:

/Product/View/321 - 向“普通”用户显示产品 ID 321
/Admin/Product/View/321 - 使用相同的 View Controller ,但为我的管理员用户提供了额外的功能。

我可以将“admin”作为名为“user”的参数传递到我的产品 Controller 上的 View 操作中,以向管理员显示额外信息,这样做的方法显示为 here .但是我需要做的是确认我的用户被允许查看该网址。我不想用检查身份验证的 ActionAttribute 来装饰我的 Product Controller ,因为当未经身份验证的用户(和登录的管理员)在/Product/View/321 上查看它时,我希望他们都看到标准 View 。

所以我想做的,在伪代码中描述如下:

当调用格式为“{userlevel}/{controller}/{action}/{id}”的 url 时,我想调用另一个执行身份验证检查的 Controller ,然后“链接”到原始 {controller } 并传递 {action}、{id} 和 {userlevel} 属性。

我该怎么做?

(我知道对 Controller 的每次调用进行检查的开销可能很小。 我想这样做,因为我以后可能需要做一些更昂贵的事情,除了用户身份验证检查和我宁愿只为我网站的低流量管理区域运行该代码。为网站的每个公共(public)用户执行这些似乎没有意义)

最佳答案

起初我认为这可能就像添加这样的新路线一样简单:

routes.MapRoute(
"Admin",
"Admin/{*pathInfo}",
new { controller="Admin", action="Index", pathInfo="" }
);

然后有一个 Controller 是这样的:
public class AdminController : Controller
{
public ActionResult Index(string pathInfo)
{
//Do admin checks, etc here....
return Redirect("/" + pathInfo);
}
}

但是,不幸的是,您可以使用的所有用于执行重定向的选项(即 Redirect、RedirectToAction 和 RedirectToRoute)都执行 302 样式重定向。基本上这意味着您的 /Admin/Product/Whatever将执行然后弹回浏览器,告诉它重定向到 /Product/Whatever在一个全新的请求中,这意味着您已经丢失了上下文。我不知道保持重定向服务器端的干净方法(即像旧的 Server.Transfer),显然是 neither does the SO community ...

(显然,这是一个非解决方案,因为它不能解决你的问题,但我想我还是把它放在这里,以防你可以以其他方式使用这些想法)

那么,这个问题的实际解决方案是什么?另一个想法是使用 ActionFilter (是的,我知道您说过您不想这样做,但我认为以下内容将满足您的目的)。像这样添加一条新路线:
routes.MapRoute(
"Admin",
"Admin/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "", userLevel = "Admin" }
);

然后像这样添加一个 ActionFilter (您可以通过您提到的基本 Controller 对象将其应用于所有请求):
public class ExtendedAdminViewAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
object userLevel = filterContext.RouteData.Values["userLevel"];
if (userLevel != null && userLevel.ToString() == "Admin")
{
//Do your security auth checks to ensure they really are an admin
//Then do your extra admin logic...
}
}
}

因此,尽管它使用了适用于所有请求的 ActionFilter,但在大多数正常情况下(即请求 /Product/Whatever )所做的唯一额外工作是对那位路由数据( userLevel )进行一次检查。换句话说,您应该真正看到普通用户的性能受到影响,因为如果他们通过 /Admin/Product/Whatever 请求,您只会进行完整的身份验证检查和额外的管理工作。 .

关于asp.net-mvc - 仅在 ASP.NET MVC 站点的一部分中将操作过滤器应用于每个 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/908423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com