MVC 管理用户对特定控制器的访问
MVC Manage users access to specific controllers
我们正忙于将遗留 ASP.NET Web 表单应用程序移植到 MVC。一些模块已完成正确设置其有效 Authorize
属性,但只有 1 个模块上线。
所以我们必须防止用户导航到不同的模块(它们在那里,但 "live" 还没有)。我们不想干预现有的 Authorize
属性,但用户目前不允许访问这些模块。
以下是我的想法和不足之处:
在 Global.asax
订阅 Application_AuthenticateRequest
并有一个 "Live" 控制器列表,检查请求 URL 并抛出并重定向到 "Not Authorized page" 如有必要。但是,我将不得不手动考虑 routing,其中 URL 可能 mysite/
可能会路由到 mysite/Foo/Bar/
.
传统的web.config
authorization
可以用于这种场景吗? (这比第 1 个更容易维护,但是网络上充斥着 不要在 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
}
然后在Global.ascx、App_Start中注册这个自定义过滤器:
protected void Application_Start()
{
FilterProviders.Providers.Add(new YourCustomFilter());
}
我们正忙于将遗留 ASP.NET Web 表单应用程序移植到 MVC。一些模块已完成正确设置其有效 Authorize
属性,但只有 1 个模块上线。
所以我们必须防止用户导航到不同的模块(它们在那里,但 "live" 还没有)。我们不想干预现有的 Authorize
属性,但用户目前不允许访问这些模块。
以下是我的想法和不足之处:
在
Global.asax
订阅Application_AuthenticateRequest
并有一个 "Live" 控制器列表,检查请求 URL 并抛出并重定向到 "Not Authorized page" 如有必要。但是,我将不得不手动考虑 routing,其中 URL 可能mysite/
可能会路由到mysite/Foo/Bar/
.传统的
web.config
authorization
可以用于这种场景吗? (这比第 1 个更容易维护,但是网络上充斥着 不要在 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
}
然后在Global.ascx、App_Start中注册这个自定义过滤器:
protected void Application_Start()
{
FilterProviders.Providers.Add(new YourCustomFilter());
}