如何验证ODataQueryOptions

时间:2018-12-18 13:23:12

标签: c# asp.net-core .net-core odata

如果OData请求的$top选项值超过全局限制,我想拒绝它。 ODataQueryOptions是手动创建的,我不知道如何正确触发其验证。

受影响的程序集

<PackageReference Include="Microsoft.AspNetCore.OData" Version="7.0.0" />

复制步骤

我这样进行全局设置:

public static void UseODataRoutes(this IRouteBuilder routeBuilder, 
    IEdmModel edmModel)
{
    routeBuilder.MapODataServiceRoute(RouteName,
        RoutePrefix,
        containerBuilder => containerBuilder.AddService(ServiceLifetime.Singleton, provider => edmModel));

    routeBuilder.Count().Filter().OrderBy().Select().MaxTop(1);

    routeBuilder.EnableDependencyInjection();
}

并手动创建一个ODataQueryOptions<TEntity>实例:

public ODataQueryFactory(IHttpContextAccessor httpAccessor, IPerRouteContainer container)
{
    _request = httpAccessor.HttpContext.Request;
    _odataServiceProvider = container.GetODataRootContainer(ODataExtentions.RouteName);
}

public ODataQueryOptions<TEntity> CreateQueryOptions<TEntity>()
    where TEntity : class
{
    var model = _odataServiceProvider.GetService<IEdmModel>();
    var path = _request.ODataFeature().Path;
    var context = new ODataQueryContext(model, typeof(TEntity), path);

    var queryOptions = new ODataQueryOptions<TEntity>(context, _request);

    return queryOptions;
}

问题在于,即使调用了MaxTop,也会忽略全局GET /foo?$top=10并导致成功的MaxTop(1)请求。

但是,如果我只添加:

queryOptions.Validate(new ODataValidationSettings()
{
    MaxTop = 1
});

对于我的工厂方法,带有$top=10的请求会产生一个外观完美的异常,导致400响应。那是我的目标。

如何使用先前传递给ODataValidationSettings的所有全局设置自动触发此验证或自动创建IRouteBuilder实例?

P.S。我想避免手动创建ODataValidationSettings,而改用标准的Odata API。

1 个答案:

答案 0 :(得分:0)

要仅使用全局选项来验证查询,请传递一个空的ODataValidationSettings参数:

queryOptions.Validate(new ODataValidationSettings());

有关GitHub的更多信息(我直接问过OData开发人员)。

P.S。我仍然不知道如何设置默认的全局限制,以防止在未指定$top的情况下从数据库中选择所有实体。默认验证不涵盖这种情况。