【问题标题】:Equivalent of UseMvc AllowAnonymous with endpoint routing (UseEndpoints) in .Net Core 3.1与 .Net Core 3.1 中的端点路由 (UseEndpoints) 等效的 UseMvc AllowAnonymous
【发布时间】:2021-01-07 13:52:55
【问题描述】:

在 .Net Core 3.1 中使用 Endpoint Routing 时,.Net Core 3.1 等效项是什么?

protected override void ConfigureTestServices(IServiceCollection services) 
    => services.AddMvc(opt => opt.Filters.Add(new AllowAnonymousFilter()));

在 .Net Core 2.2 中,我有 Startup 如下:

public void Configure(IApplicationBuilder app)
{
    // ... 
    app.UseAuthentication();
    app.UseAuthorization();
    app.UseMvc();
}

在我的测试中,在 .Net Core 2.2 中,我会:

protected void ConfigureTestServices(IServiceCollection services)
    => services.AddMvcCore(x => x.Filters.Add(new AllowAnonymousFilter()));

在 .Net Core 3.1 中,我有...

public void Configure(IApplicationBuilder app)
{
    // ... 
    app.UseAuthentication();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHealthChecks((builder) =>
            builder.WithMetadata(new AllowAnonymousAttribute()));
        endpoints.MapControllers();
    });
}

我如何允许我的所有测试在未经授权的情况下运行,就像我过去在 .Net Core 2.2 中一样? (注意,在生产中,我希望对控制器端点进行授权;并允许在测试期间匿名访问控制器端点)

【问题讨论】:

    标签: .net asp.net-core asp.net-core-3.1


    【解决方案1】:
    services.AddMvc(opt => opt.Filters.Add(new AllowAnonymousFilter()));
    

    在 ASP.NET Core 3.x 及更高版本中的“现代”等效项如下:

    services.AddControllers(opt => opt.Filters.Add(new AllowAnonymousFilter()));
    

    或者,您也可以使用AddRazorPages()AddControllersWithViews(),具体取决于您的应用程序设置方式。

    AddMvc 实际上仍然受支持,字面意思是AddRazorPages()AddControllersWithViews() 的组合。同样,AddMvcCore 也仍然存在,实际上被所有其他 Add~ 方法调用。

    所以你真的可以做以下任何事情,而且他们大多做同样的事情:

    services.AddMvc(opt => opt.Filters.Add(new AllowAnonymousFilter()));
    services.AddMvcCore(opt => opt.Filters.Add(new AllowAnonymousFilter()));
    services.AddControllers(opt => opt.Filters.Add(new AllowAnonymousFilter()));
    services.AddControllersWithViews(opt => opt.Filters.Add(new AllowAnonymousFilter()));
    services.AddRazorPages(opt => opt.Filters.Add(new AllowAnonymousFilter()));
    

    请注意,这实际上并不需要对端点路由做任何事情。从AddMvcAddControllersAddControllersWithViewsAddRazorPages 的迁移只是进一步拆分底层框架依赖项的一种方式,因此您只需为运行应用程序实际需要的那些依赖项付费。例如。如果您只有 API 控制器,则不需要 Razor 引擎,只需调用 AddControllers() 即可退出。

    另一方面,端点路由是从UseMvcUseRoutingUseEndpoints 的移动。这适用于中间件管道的工作方式,而不是依赖项的设置方式。为了注册全局 MVC 过滤器,您仍然可以通过使用上面的 Add~ 调用之一配置 MvcOptions 来全局配置这些过滤器。

    【讨论】:

    • 感谢您,我曾尝试设置opt.Filters.Add(new AllowAnonymousFilter()),但在提问之前没有运气。也许我没有清楚地描述我面临的问题(尽管我尝试过) - 我使用services.AddSingleton<IPolicyEvaluator, FakePolicyEvaluator>(); 解决了这个问题,然后实现了FakePolicyEvaluator,这样我就可以向端点发出未经授权的请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    相关资源
    最近更新 更多