当站点具有全局 AuthorizeAttribute 时,ASP.NET 允许匿名访问 OData $metadata

标签 asp.net asp.net-web-api odata asp.net-web-api2 odata-v4

我有一个 ASP.NET OData 站点,WebApiConfig 文件中包含以下内容:

config.Filters.Add(new AuthorizeAttribute())

这会强制所有调用者在调用任何 Controller 之前进行身份验证。
不幸的是,这也强制用户身份验证访问“$metadata”url。
我需要对所有 Controller 访问进行全局强制身份验证,同时还允许匿名访问“$metadata”url。

最佳答案

我意识到这个问题已经得到解答,但我对已接受的答案有一些担忧:

  • 假设元数据端点不会更改
  • 如果添加/移动端点,则需要更新代码
  • 不处理根端点(没有/$meatdata)

我同意创建您自己的AuthorizeAttribute,但我会以稍微不同的方式实现该方法。

    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        if (actionContext.ControllerContext.Controller is System.Web.OData.MetadataController)
            return true;

        return base.IsAuthorized(actionContext);
    }

我的解决方案只是检查正在访问的 Controller 是否是 OData 的 MetadataController。如果是,则允许任何人访问,否则,请进行正常的授权检查。

关于当站点具有全局 AuthorizeAttribute 时,ASP.NET 允许匿名访问 OData $metadata,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35894875/

相关文章:

c# - 如何在 C# 中定义带有抽象参数的 REST 方法

javascript - 将具有两个属性(数组和对象)的对象发布到 webapi? -asp.net webpi

asp.net-mvc - 自定义类型的 Web Api OData 查询

c# - 如何确定字符串是否包含字符串列表的任何匹配项

asp.net - ReportViewer 控件返回空白页

c# - ASP.Net 4.5 模型绑定(bind)按导航属性排序

ASP.NET 空网站模板

c# - 如何按 OData 中的嵌套属性进行过滤?

请求中的 Javascript、BackboneJS、oData 单引号

C# 通过匹配字符串数组来选择 CheckBoxList 项目