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基类又派生自ControllerSecurityPrincipalSecuredController的属性,包含有关当前用户的大量活动目录数据。

为了消除重复代码,理想情况下,我想将if {...}块中包含的功能移动到基类方法中,但我想不出任何方法可以做到这一点,因为该方法的返回类型必须ActionResult,导致像这样笨拙的东西:

if ((var result = this.RequireReadWrite()) != null)
{
    return result;
}

谁能提出一种方法来做到这一点,或者我只是在这里不走运?

ASP.NET MVC - (可选)从基类方法重定向

正如评论中提到的,特别是注意到安全性是一个横切问题,我们建议使用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());