C# MVC管理用户对特定控制器的访问
我们正忙于将传统ASP.NET web表单应用程序移植到MVC。一些模块正确设置了有效的C# MVC管理用户对特定控制器的访问,c#,asp.net,asp.net-mvc,authorization,C#,Asp.net,Asp.net Mvc,Authorization,我们正忙于将传统ASP.NET web表单应用程序移植到MVC。一些模块正确设置了有效的授权属性,但只有一个模块开始运行 因此,我们必须防止用户导航到不同的模块(这些模块已经存在,但尚未“激活”)。我们不想干预现有的Authorize属性,但用户目前不允许访问这些模块 以下是我的想法和不足: 在Global.asax中订阅Application\u AuthenticateRequest并拥有一个“活动”控制器列表,检查请求URL,必要时抛出并重定向到“未授权页面”。但是,如果URL可以mysi
授权
属性,但只有一个模块开始运行
因此,我们必须防止用户导航到不同的模块(这些模块已经存在,但尚未“激活”)。我们不想干预现有的Authorize
属性,但用户目前不允许访问这些模块
以下是我的想法和不足:
Global.asax
中订阅Application\u AuthenticateRequest
并拥有一个“活动”控制器列表,检查请求URL,必要时抛出并重定向到“未授权页面”。但是,如果URL可以mysite/
路由到mysite/Foo/Bar/
,那么我将不得不手动考虑路由问题web.config
授权能否用于此场景?(这比1号更容易维护,但是web上到处都是不要在MVC中这样做)
Customer
是控制器:
<location path="Customer">
<system.web>
<authorization>
<deny users="*" />
</authorization>
</system.web>
</location>
Authorize
属性:(希望不要走这条路如果您能向更好的方向努力,我们将不胜感激。在这种情况下,您可以使用asp.net mvc过滤器
public class YourCustomFilter : IFilterProvider
{
public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
List<Filter> result = new List<Filter>();
var routeData = controllerContext.HttpContext.Request.RequestContext.RouteData;
var controller = routeData.GetRequiredString("controller");
var action = routeData.GetRequiredString("action");
if (controller != "livecontrollername" && action != "liveactionname")
{
result.Add(new Filter(new YourCustomAuthorizeAttribute(), FilterScope.Global, null));
}
return result;
}
}
public class YourCustomAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
//Do something to prevent user from accessing the controller here
}
在web配置中创建一个密钥,在其中指定Beta阶段的控制器列表。在另一个属性(如BetaAuthorizationAttribute)中获取该列表,并将用户重定向到某个位置,或者作为YouTunks@RazvanDumitru的参考,这是一个非常好的主意。这意味着必须更改现有的
Authorize
属性很幸运,但一旦完成,我可以轻松控制对live vs beta或控制器的访问。
protected void Application_Start()
{
FilterProviders.Providers.Add(new YourCustomFilter());
}