即使在使用 ASP.NET CORE Web Api 启用 CORS 后,仍然可以通过 POSTMAN 访问 API [重复]

Posted

技术标签:

【中文标题】即使在使用 ASP.NET CORE Web Api 启用 CORS 后,仍然可以通过 POSTMAN 访问 API [重复]【英文标题】:API is still accessible through POSTMAN even after enabling CORS with ASP.NET CORE Web Api [duplicate] 【发布时间】:2021-09-19 14:29:54 【问题描述】:

我创建了以下...

    一个在 IIS 上运行的后端 .NET Core POST API 使用 Angular CLI 创建并分别使用端口 8888 和 9999 运行的两个 UI 应用 我已在 .NET Core 应用程序中启用 CORS

在 .NET Core 中集成 CORS 时,我在 startup.cs 中添加了以下内容

Startup.cs

public class Startup
    
        readonly string _allowSpecificOrigins = "_allowOrigin";

        public Startup(IConfiguration configuration)
        
            Configuration = configuration;
        

        public IConfiguration Configuration  get; 

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        
            services.AddControllers();
            services.AddCors(policy =>
            
                policy.AddPolicy(name: _allowSpecificOrigins, options => options.WithOrigins("http://localhost:9999").AllowAnyHeader().AllowAnyMethod());
            );            
        

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
            
            
            app.UseRouting();
            app.UseCors(options => options.WithOrigins("http://localhost:9999").AllowAnyHeader().AllowAnyMethod());
            app.UseAuthorization();
            
            app.UseEndpoints(endpoints =>
            
                endpoints.MapControllers().RequireCors(_allowSpecificOrigins);
            );
        
    

CORS 按预期完美运行。为了测试,我创建了两个 Angular 应用程序,它们使用两个不同的端口 8888 和 9999 运行。端口 9999 已配置并允许在 startup.cs 中访问 API。因此,从 PORT 9999 应用程序可以访问 API,而具有 PORT 8888 端口的应用程序由于 CORS 错误而无法访问 API,正如您所看到的响应。

API response when calling from the url http://localhost:8888

API response when calling from the url http://localhost:9999

现在的问题是,在覆盖所有标题后,我仍然可以从 POSTMAN 访问相同的 API

接受 接受编码 连接 参考 甚至是用户代理

Please look at the response received from POSTMAN

非常感谢任何帮助。谢谢。

【问题讨论】:

***.com/questions/36250615/cors-with-postman 看来你的Startup.cs 实现CORS 是正确的。 POSTMAN 有一些内部功能可以打破这一点,因此建议在这种情况下不要考虑POSTMAN,您可以尝试从其他Web AppApplication 访问应该强制执行CORS。让我知道您是否也可以从其他应用程序访问,然后我们可以进一步调查。 @MdFaridUddinKiron:为了测试,我创建了两个 Angular 应用程序,它们使用不同的端口 8888 和 9999 运行。端口 9999 已配置并允许在 startup.cs 中访问 API。因此,应用程序可以从 PORT 9999 访问 API,而使用 PORT 8888 的应用程序由于 CORS 错误而无法访问 API。 【参考方案1】:

CORS 由浏览器强制执行。 POSTMAN 等工具不会强制执行 CORS。

【讨论】:

另外,Postman 调用不是跨域的。 Postman 可以看作是一种机器对机器的通信。 那么,请告诉我们如何保护我们的 API 免受 POSTMAN 的攻击。 @SukantaRoy CORS 是为了保护用户,而不是您的服务器。如果您不希望未经身份验证的用户访问您的 api,则必须使用身份验证。 好的,谢谢您的回复。但是我们仍然可以将 token 和其他授权属性(可能取自另一个有效的身份验证)覆盖到 header。 @SukantaRoy 取决于身份验证方法,但假设是 jwt; jwt 是个人的,因此应以不易获取的方式保存,但也是短暂的,您可以使用刷新令牌来保持会话状态,并且令牌应由颁发者和受众验证。它的内容远不止这些,但这些是基本要素。如果您不确定该机制是否安全,您可以读取 oauth2 和/或 open-id。【参考方案2】:

为了保护您的 API,我建议使用 JWT 令牌。您可以将 [Authorize] 添加到可消费的 Restul API,只有拥有令牌的人才能使用 API。您还可以使用它管理角色等等。例如: [Authorize(Roles = "Admin") 将导致只能由管理员角色使用的 api。我建议您检查一下:https://jasonwatmore.com/post/2019/10/11/aspnet-core-3-jwt-authentication-tutorial-with-example-api

【讨论】:

以上是关于即使在使用 ASP.NET CORE Web Api 启用 CORS 后,仍然可以通过 POSTMAN 访问 API [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP .NET Core 2.1 Web Api 中启用 CORS

为啥即使我调用 UseHttpsRedirection ASP.NET Core 重定向也不起作用?

将 asp.net core web api 部署到 IIS 7.5 时出现 500 错误

即使使用 ASP.NET CORE 登录,我在 Angular 中也有 401 Unauthorized

为 ASP.Net Core Web API 项目创建要在启动时转到的索引页面

即使在 asp.net core 5.0 中提供了不记名令牌,也会返回 401 [关闭]