Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC-是否可以选择从基类方法重定向?_C#_Asp.net Mvc_Actionmethod - Fatal编程技术网

C# ASP.NET MVC-是否可以选择从基类方法重定向?

C# ASP.NET MVC-是否可以选择从基类方法重定向?,c#,asp.net-mvc,actionmethod,C#,Asp.net Mvc,Actionmethod,考虑以下代码块,它在我的许多控制器操作中重新出现。(我主要关注方法主体的前6行) 我的控制器派生自一个基类,SecuredController,该基类又派生自ControllerSecurityPrincipal是SecuredController的属性,包含有关当前用户的大量Active Directory数据 为了消除重复代码,理想情况下,我希望将if{…}块中包含的功能移动到基类方法中,但我想不出任何方法,因为该方法的返回类型必须是ActionResult,导致类似这样的情况: if ((

考虑以下代码块,它在我的许多控制器操作中重新出现。(我主要关注方法主体的前6行)

我的控制器派生自一个基类,
SecuredController
,该基类又派生自
Controller
SecurityPrincipal
SecuredController
的属性,包含有关当前用户的大量Active Directory数据

为了消除重复代码,理想情况下,我希望将
if{…}
块中包含的功能移动到基类方法中,但我想不出任何方法,因为该方法的返回类型必须是
ActionResult
,导致类似这样的情况:

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

有人能提出一种方法来做到这一点吗,或者我在这里只是运气不好吗?

如评论中所述,特别要注意的是,我们建议在您的用例和设计中使用安全性。
微软的文档内容丰富,在网上可以找到更多关于如何使用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());

那使用什么呢?你在设计中考虑过吗?使用
filterContext
可以更好地控制
ActionResult
应该是什么。过滤器听起来很合适。一般来说,如果您在方法中执行安全操作,那么您就是做错了。安全性是一个贯穿各领域的问题,应该在执行该方法之前进行处理。如前所述,过滤器是处理这个问题的更好方法,MVC有一个完整的框架。你试图推出你自己的安全,这几乎总是一个反模式。基本上,你的房子里有一套昂贵且经过良好测试的安全系统,你不锁门,让一个无聊的青少年确保房子安全。@QuantumHive,这是个好办法。真不敢相信我错过了(我需要一个答案,这样我就可以投票并接受。然后我将简要介绍我自己,以获得正确的喜好。我强烈推荐作为您的DI容器。非常感谢。这几乎正是我所做的,而且它工作得非常完美。因为我只需要在一些操作方法上使用它,所以我决定用属性来装饰这些方法,而不是注册这是一个全局处理程序。再次感谢!
GlobalFilters.Filters.Add(new SecuredFilterAttribute());