ASP.NET MVC - (可选)从基类方法重定向
本文关键字:基类 类方法 重定向 可选 NET MVC ASP | 更新日期: 2023-09-27 17:57:11
请考虑以下代码块,它在我的许多控制器操作中重新出现。(我主要关注方法主体的前 6 行)。
[HttpGet]
public ActionResult OptOut()
{
var user = this.SecurityPrincipal;
if (user.IsReadOnlyUser)
{
this.TempData["ViewModel"] = new AuthorizationModel { User = user };
return this.RedirectToAction("NotAuthorized", "Authorization");
}
var model = /* Elided for brevity */
return this.View(model);
}
我的控制器派生自基类,SecuredController
基类又派生自Controller
。 SecurityPrincipal
是SecuredController
的属性,包含有关当前用户的大量活动目录数据。
为了消除重复代码,理想情况下,我想将if {...}
块中包含的功能移动到基类方法中,但我想不出任何方法可以做到这一点,因为该方法的返回类型必须ActionResult
,导致像这样笨拙的东西:
if ((var result = this.RequireReadWrite()) != null)
{
return result;
}
谁能提出一种方法来做到这一点,或者我只是在这里不走运?
正如评论中提到的,特别是注意到安全性是一个横切问题,我们建议使用MVC操作过滤器应用于您的用例和设计。
Microsoft的文档非常有用,并且可以在网络上找到有关如何使用MVC过滤器的更多示例。我将尝试提供一个示例,但这将基于对您的软件架构的许多假设,因为我根本不了解这一点。
您可以创建以下类:
public class SecuredFilterAttribute : AuthorizeAttribute
{
...
}
如果使用依赖关系注入框架,则可以注入SecurityPrincipal
服务。但同样,我不知道您的应用程序的体系结构,因此如何创建该依赖项取决于您。
当覆盖AuthorizeCore
时,你可以像这样实现它:
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return !this.SecurityPrinciple.IsReadOnlyUser;
}
当未经授权时,覆盖重定向HandleUnauthorizedRequest
方法:
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
var redirectRoute = ...; //your route to redirect to an unauthorized page
filterContext.Result = new RedirectToRouteResult(redirectRoute);
//do some other things, for example, setting some tempdata information
}
同样,这取决于您将如何使用此过滤器。可以全局注册它,也可以基于每个控制器或操作应用它。要在初创公司中全局注册它,请执行以下操作:
GlobalFilters.Filters.Add(new SecuredFilterAttribute());