- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下在我的许多 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
,后者又派生自 Controller
。 SecurityPrincipal
是 SecuredController
的属性,包含有关当前用户的大量 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/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!