代码之家  ›  专栏  ›  技术社区  ›  Alan Clark

ASP。网Core允许在设置RequireAuthenticatedUser()时匿名访问OData$元数据

  •  0
  • Alan Clark  · 技术社区  · 6 年前

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

    0 回复  |  直到 6 年前
        1
  •  0
  •   Máté Gábor    5 年前

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

    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());
                })