重庆熊猫 Loading

跨域配置(CORS Configuration)-ASP.NET Core教程

更新记录

点击查看
2024年2月28日 优化结构。
2022年11月1日 从笔记迁移到博客。发布。

说明

Cross-Origin Resource Sharing,跨域资源共享

配置方式

在ASP.NET Core中有2种方式配置跨越:
1、中间件方式(middleware approach)
2、特性修饰方式(attributes approach)

中间件方式一般用于配置全局的CORS配置。特性修饰方式配置跨域一般用于指定的控制器和动作。适用范围不同。

中间件方式配置Cors(Implementing CORS using the middleware approach)

开启UseCors() 中间件

具体实现实际上很简单,ASP.NET Core已经内置支持,只用开启 UseCors() 中间件即可。

打开Startup.cs文件,在配置开启CORS中间件即可。

namespace PandaTest.API
{
    public class Startup
    {
       ...
        public void Configure(IApplicationBuilder app, IWebHostingEnvironment env)
        {
            ...
            //开启CORS
            app.UseCors(corsConfig =>
            {
                //具体的配置项
            });
            ..
        }
    }
}

配置具体的Cors规则(直接在中间件中配置)

配置允许所有的域名。

app.UseCors(corsConfig =>
{
    //允许所有域名
	corsConfig.AllowAnyOrigin();
});

配置允许指定的域名。其他域名都会被block。

namespace Catalog.API
{
    public class Startup
    {
       ...
        public void Configure(IApplicationBuilder app, 
        IWebHostingEnvironment env)
        {
            ...
            app.UseCors(corsConfig =>
            {
                //配置允许的域名
                corsConfig.WithOrigins("https://panda666.com");
                //注意:末尾不要带/
            });
            ...
        }
    }
}

注意:有一个坑,允许的URL末尾不要带/

配置具体的Cors规则(在服务中定义规则 Policy,在中间件中调用)

namespace Catalog.API
{
    public class Startup
    {

        public void ConfigureServices(IServiceCollection services)
        {
            ...
            //在服务中增加Cors服务
            services.AddCors(corsOtions =>
            {
                //增加 Policy
                corsOtions.AddPolicy("BlogDomainPolicy", corsConfig => { 
			       //具体的配置项
                    corsConfig.WithOrigins("https://samuele.dev"); 
                });
            });
            ..
        }

        public void Configure(IApplicationBuilder app,IWebHostingEnvironment env)
        {
           ...
            //在中间件中启用Cors,并使用指定策略
            app.UseCors("BlogDomainPolicy");
           ...
        }
    }
}

在单独的扩展方法中定义Cors相关的配置

可以在ConfigureServices()中配置服务 和 Configure 配置中间件。为了提高可复用性、可维护性,还可以把相关的配置放入到自定义的扩展方法中。

在项目中添加Extensions文件夹。在Extensions文件夹下,添加ServiceCorsExtensions.cs类文件

image

然后在 ServiceCorsExtensions.cs 类文件中写入。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using WebApplication6;
using Microsoft.Extensions.DependencyInjection;
namespace WebApplication6.Extensions
{
    public static class ServiceCorsExtensions
    {
        /// <summary>
        /// 配置跨域访问扩展方法
        /// </summary>
        /// <param name="services"></param>
        public static void ConfigureCors(this IServiceCollection services) =>
            	//配置Cors
                services.AddCors(options =>
                {
                    options.AddPolicy("CorsPolicy", corsConfig =>
                    	corsConfig.AllowAnyOrigin() 	//配置允许的域名
                    		      .AllowAnyMethod()   	//配置允许的HTTP方法
                    			 .AllowAnyHeader()); 	//配置允许的头内容
                });
    }
}

说明:
AllowAnyOrigin()表示配置允许的域名,如果需要进行限制,可以使用WithOrigins("https://example.com")。
AllowAnyMethod()表示配置允许的HTTP方法,如果需要进行限制,可以使用WithMethods("POST", "GET")。
AllowAnyHeader()表示配置允许的头内容,如果需要进行限制,可以使用WithHeaders("accept", "contentype") 。

在Service中进行使用,在Startup.cs文件中的Startup类中
引入命名空间

using WebApplication6.Extensions;

配置服务,增加Cors服务。

public void ConfigureServices(IServiceCollection services)
{
    //添加服务,使用自定义的扩展方法
    services.ConfigureCors();
    services.AddControllers();
}

配置中间件,启动Cors中间件。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    //使用跨域
    app.UseCors("CorsPolicy");
    //...
}

特性方式配置Cors(Implementing CORS using the attribute approach)

使用特性方式配置Cors,只在指定的Controller和Action上生效。配置和使用中间件配置大同小异。同样是先配置服务,在配置中间件。然后在指定的控制器或者动作方法上加入[EnableCors]特性修饰即可。

配置服务,增加Cors服务,并新增一个Policy策略。

builder.Services.AddCors(options =>
{
    options.AddPolicy("PandaPolicy", policyConfig =>
    {
        policyConfig.AllowAnyOrigin()
                    .AllowAnyHeader()
                    .AllowAnyMethod();
    });
});

配置中间件,增加 Cors 中间件。

//启用Cors中间件
app.UseCors();

引入命名空间

using Microsoft.AspNetCore.Cors;

使用 [EnableCors] 特性启用,需要指定我们设置好的Policy策略。

namespace Catalog.API.Controllers
{
    [Route("api/items")]
    [ApiController]
    [JsonException]
    [EnableCors("BlogDomainPolicy")]
    public class ItemController : ControllerBase
    {
    }
}

还可以在同一个控制器中,使用不同的 Policy 策略。

namespace Catalog.API.Controllers
{
    [Route("api/items")]
    [ApiController]
    [JsonException]
    //启用Cors
    [EnableCors("BlogDomainPolicy")]
    public class ItemController : ControllerBase
    {
        ...

        [HttpGet("{id:guid}")]
        //启用Cors,策略不同
        [EnableCors("GetByIdActionPolicy")]
        public async Task<IActionResult> GetById(string id)
        {
            ...
        }
    }
}
posted @ 2022-11-01 08:49  重庆熊猫  阅读(2066)  评论(0编辑  收藏  举报