更新记录
转载请注明出处:
2022年11月1日 发布。
2022年11月1日 从笔记迁移到博客。

说明

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

配置方式

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

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

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

开启UseCors() 中间件

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

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

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

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

配置允许所有的域名。

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

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

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

配置具体的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)
        {
            ...
        }
    }
}

原文地址:http://www.cnblogs.com/cqpanda/p/16846544.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性