如何在不影响框架功能的情况下保护AbpServiceProxies/GetAll API?
解决方案
针对Abp 7.4版本中AbpServiceProxies/GetAll API未授权可访问的问题,提供以下几种安全防护方案,均不影响框架核心功能:
方案一:为ServiceProxies控制器添加全局授权
通过自定义控制器替换默认的AbpServiceProxiesController,并添加[Authorize]属性,限制仅授权用户可访问该API:
- 创建自定义控制器:
[Authorize] public class CustomServiceProxiesController : AbpServiceProxiesController { public CustomServiceProxiesController( IAspNetCoreApiDescriptionGroupCollectionProvider apiDescriptionGroupCollectionProvider, IAbpApiProxyScriptGenerator apiProxyScriptGenerator) : base(apiDescriptionGroupCollectionProvider, apiProxyScriptGenerator) { } }
- 在模块的
ConfigureServices方法中替换默认服务:
public override void ConfigureServices(ServiceConfigurationContext context) { // 替换默认的ServiceProxies控制器 context.Services.Replace(ServiceDescriptor.Transient<AbpServiceProxiesController, CustomServiceProxiesController>()); // 其他配置... }
方案二:仅返回无授权要求的公开API
如果需要保留API访问权限,但只对外暴露无[Authorize]属性的公开接口,可自定义API代理生成器过滤敏感路由:
- 创建自定义代理生成器:
public class RestrictedApiProxyScriptGenerator : AbpApiProxyScriptGenerator { public RestrictedApiProxyScriptGenerator(IOptions<AbpApiProxyOptions> options) : base(options) { } protected override IEnumerable<ApiDescription> GetApiDescriptions(ApiDescriptionGroupCollection apiDescriptionGroups) { var allApiDescriptions = base.GetApiDescriptions(apiDescriptionGroups); // 过滤掉带有Authorize属性的API return allApiDescriptions.Where(apiDesc => !apiDesc.ActionDescriptor.EndpointMetadata.Any(metadata => metadata is AuthorizeAttribute)); } }
- 在模块的
ConfigureServices方法中替换服务:
public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.Replace(ServiceDescriptor.Transient<IAbpApiProxyScriptGenerator, RestrictedApiProxyScriptGenerator>()); // 其他配置... }
方案三:完全关闭ServiceProxies功能
如果你的项目不需要前端自动生成API代理的功能,可直接在配置文件中禁用该服务:
在appsettings.json中添加以下配置:
{ "Abp": { "ApiProxy": { "IsEnabled": false } } }
内容的提问来源于stack exchange,提问作者Firas
相关产品推荐
相关产品推荐

