【问题标题】:ASP.NET.Core allow anonymous access to OData $metadata when RequireAuthenticatedUser() is set设置 RequireAuthenticatedUser() 时,ASP.NET.Core 允许匿名访问 OData $metadata
【发布时间】:2020-04-25 13:58:46
【问题描述】:

我有一个 ASP.NET Core 2.1 网站,在 WebApiConfig 文件中包含以下内容:

 services.AddMvc(config =>
            {
                // Force authorization for all controllers
                var policy = new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .Build();
                config.Filters.Add(new AuthorizeFilter(policy));
            })

这会强制所有调用者在调用任何控制器之前进行身份验证。 不幸的是,这也强制用户身份验证访问 OData "$metadata" URL。

有没有办法允许匿名访问元数据页面?

注意:这与下面的问题相同(但针对 .NET Core)

ASP.NET allow anonymous access to OData $metadata when site has global AuthorizeAttribute

【问题讨论】:

  • 不是最好的方法,但你可以这样做:joonasw.net/view/apply-authz-by-default。基本上,您构建的东西会按照惯例找到您的控制器,通过向它们添加 AuthorizeFilter 来使它们安全。这将避免将其添加到 OData 中。所以我认为它会起作用。我能想到的另一件事是过滤器。但我不想那样做。
  • 感谢@jpgrassi,这可能适用于我定义的 odata 控制器,但约定似乎没有捕获 Microsoft.AspNet.OData.Extensions.AddOData() 注册的 $metadata 控制器我相信。
  • 是的,但它的想法是不要抓住它,从而让它保持打开状态(未经身份验证)
  • 也许我并不清楚,因为我在手机上输入了这个:您将删除全局 config.Filters.Add(new AuthorizeFilter(policy));,这意味着您的所有控制器(包括由 NuGet 包添加的控制器)都可以公开访问。为了避免必须手动将Authorize 添加到所有*您的控制器*,您创建了这个“自动添加”约定。目标是您创建的所有控制器都受到保护,但 OData NuGet 包添加的控制器不受保护。有意义吗?

标签: c# asp.net-core odata


【解决方案1】:

通过以下实现,您可以匿名访问 OData $metadata 并为任何其他控制器保持身份验证: (如果您之前正确设置了 OData 服务,将自动生成名称为“元数据”的控制器 - 此处不包括)。

1.) 添加以下类

    using Microsoft.AspNetCore.Mvc.ApplicationModels;
    using Microsoft.AspNetCore.Mvc.Authorization;
    public class AuthorizeFiltersControllerConvention : 
    IControllerModelConvention
    {
        public void Apply(ControllerModel controller)
        {
            if (!controller.ControllerName.Contains("Metadata"))
            {
                controller.Filters.Add(new AuthorizeFilter("defaultPolicy"));
            }
        }
     }

2.) 在 StartUp 类的 ConfigureServices 方法中删除现有的 addMvc 方法并添加以下内容:

      services.AddAuthorization(o =>
            {
                o.AddPolicy("defaultPolicy", b =>
                {
                    b.RequireAuthenticatedUser();
                });
            });

       services.AddMvc(o =>
            {
                o.Conventions.Add(new AuthorizeFiltersControllerConvention());
            })

【讨论】:

    猜你喜欢
    • 2016-06-24
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 2014-09-02
    • 2019-11-23
    • 2016-08-31
    • 1970-01-01
    相关资源
    最近更新 更多