要使控制器在其自己的区域之外无法访问,您可以在ASP.NET Core MVC 3.1中使用自定义路由约束。以下是一个解决方案的示例:
首先,在您的项目中创建一个自定义路由约束类,该类将用于限制控制器的访问范围。例如,创建一个名为"AreaRouteConstraint.cs"的文件,并添加以下代码:
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
public class AreaRouteConstraint : IRouteConstraint
{
private readonly string _areaName;
public AreaRouteConstraint(string areaName)
{
_areaName = areaName;
}
public bool Match(HttpContext httpContext, IRouter route, string routeKey,
RouteValueDictionary values, RouteDirection routeDirection)
{
if (values.TryGetValue("area", out object areaValue))
{
string area = areaValue.ToString();
return string.Equals(area, _areaName, StringComparison.OrdinalIgnoreCase);
}
return false;
}
}
然后,在您的控制器类上应用路由约束。例如,假设您的控制器位于名为"Admin"的区域中,您可以在控制器类上使用[Route]
属性,并指定AreaRouteConstraint
来限制访问范围。例如:
[Area("Admin")]
[Route("{area:exists}/{controller=Home}/{action=Index}")]
public class HomeController : Controller
{
// 控制器的操作方法
}
在上面的代码中,我们将AreaRouteConstraint
指定为{area:exists}
路由约束,这将确保只有area
值等于"Admin"的请求才能访问控制器。
最后,您需要在Startup.cs
文件的ConfigureServices
方法中注册自定义路由约束。例如,将以下代码添加到ConfigureServices
方法中的services.AddControllersWithViews()
之前:
services.Configure(options =>
{
options.ConstraintMap.Add("area", typeof(AreaRouteConstraint));
});
通过这样做,您告诉ASP.NET Core MVC将area
约束映射到AreaRouteConstraint
类。
现在,只有area
值等于"Admin"的请求才能访问带有[Area("Admin")]
属性的控制器。
注意:为了使上述示例正常工作,您还需要确保项目中已经正确配置了区域。