设置了RequireAuthenticatedUser()后,ASP.NET.Core允许匿名访问OData $ metadata

时间:2019-02-28 21:58:23

标签: c# asp.net-core odata

我有一个 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

1 个答案:

答案 0 :(得分:0)

通过以下实现,您可以匿名访问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());
            })