gpt4 book ai didi

c# - ASP.NET MVC - 可选地从基类方法重定向?

转载 作者:行者123 更新时间:2023-11-30 23:23:25 25 4
gpt4 key购买 nike

考虑以下在我的许多 Controller 操作中重复出现的代码块。 (我主要关注方法体的前 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);
}

我的 Controller 派生自基类 SecuredController,后者又派生自 ControllerSecurityPrincipalSecuredController 的属性,包含有关当前用户的大量 Active Directory 数据。

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

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

任何人都可以建议一种方法来做到这一点,还是我在这里运气不好?

最佳答案

如评论中所述,特别注意安全性是 cross cutting concern我们建议使用 MVC Action Filters应用于您的用例和设计。
Microsoft 的文档提供了非常丰富的信息,并且可以在网络上找到更多关于如何使用 MVC 过滤器 的示例。我将尝试提供一个示例,但这将基于对您的软件架构的大量假设,因为我根本不了解这方面的知识。

您可以创建以下类:

public class SecuredFilterAttribute : AuthorizeAttribute
{
...
}

如果使用 Dependency Injection框架,您可以注入(inject) 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
}

如何使用此过滤器同样取决于您。您可以在全局范围内注册它,或者在每个 Controller 或操作的基础上应用它。要在全局范围内注册它,请在您的初创公司中:

GlobalFilters.Filters.Add(new SecuredFilterAttribute());

关于c# - ASP.NET MVC - 可选地从基类方法重定向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38399308/

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