首页 > 其他分享 >[2core]跨域资源共享CORS

[2core]跨域资源共享CORS

时间:2022-10-09 14:55:05浏览次数:47  
标签:跨域 2core Instance CorsPolicy AppSetting static CORS public

迁移问题

在ASP.NET 4.x时期,解决CORS问题是非常容易的,仅需在配置文件web.config里增加相应的配置节点即可,无法在程序中进行编码。在ASP.NET Core中,一切都是DI+配置Options化,确实有些不太习惯,也没有时间研究CORS配置化实现方法。所以只能把CORS配置项保存到appsettings.json文件里,然后在代码中编码实现CORS功能,因此,本文重点记录实现过程。

 

解决方案

1.ASP.NET 4.x时期web.config文件配置CORS

<system.webServer>
        <httpProtocol>
            <customHeaders>
                <!--多个对象用英文逗号分隔-->
                <add name="Access-Control-Allow-Origin" value="*" />
                <!--若为true,Origin节点不能为*-->
                <add name="Access-Control-Allow-Credentials" value="false" />
                <!--多个对象用英文逗号分隔-->
                <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,HEAD,OPTIONS" />
                <!--多个对象用英文逗号分隔-->
                <add name="Access-Control-Allow-Headers" value="X-Requested-With,origin,content-length,content-type,accept,Authorization,ApplicationType,LanguageType" />
                <!--前端可以通过getResponseHeader读取值-->
                <add name="Access-Control-Expose-Headers" value="Set-Token" />
                <!--用来指定本次预检请求的有效期(20天),单位为秒,设置后有效期内不在发预检查请求-->
                <add name="Access-Control-Max-Age" value="2592000" />
            </customHeaders>
        </httpProtocol>
    </system.webServer>

2.ASP.NET Core的玩法
1)在appsettings.json文件里配置好CORS项

{
  //配置CORS策略
  "CorsPolicy": {
    //多个对象用英文逗号分隔
    "AllowOrigins": "*",
    //若为true,Origin节点不能为*
    "AllowCredentials": "false",
    //多个对象用英文逗号分隔
    "AllowMethods": "GET,PUT,POST,DELETE,HEAD,OPTIONS",
    //多个对象用英文逗号分隔
    "AllowHeaders": "X-Requested-With,origin,content-length,content-type,accept,Authorization,ApplicationType,LanguageType",
    //前端可以通过getResponseHeader读取值
    "ExposeHeaders": "Set-Token",
   //用来指定本次预检请求的有效期(20天),单位为秒,设置后有效期内不在发预检查请求
"MaxAge": 8640000
  }
}

2)定义CORS策略对应的Options类CorsPolicyOptions

public class CorsPolicyOptions
    {
        public string AllowOrigins { get; set; } = "*";
        public bool AllowCredentials { get; set; } = false;
        public string AllowMethods { get; set; } = "GET,PUT,POST,DELETE,HEAD,OPTIONS";
        public string AllowHeaders { get; set; } = "X-Requested-With,origin,content-length,content-type,accept,Authorization";
        public string ExposeHeaders { get; set; } = "Set-Token";
        public int MaxAge { get; set; } = 8640000;
    }

3)定义appsettings.json文件对应的AppSettings类文件,在AppSettings类的私有类里实现CORS策略的读取

public class AppSetting
    {
        private static object _objLocker = new object();
        private static AppSetting _instance;
        private AppSetting() { }
        public static AppSetting Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (_objLocker)
                    {
                        if (_instance == null)
                        {
                            _instance = new AppSetting();
                            AppSettingConfig.Load(_instance);
                        }
                    }
                }
                return _instance;
            }
        }
        private class AppSettingConfig
        {
            private static AppSetting _appSetting;
            public static void Load(AppSetting appSetting)
            {
                _appSetting = appSetting;

                Compute();
                ChangeToken.OnChange(() => ConfigObjectManager.Instance.AppSetting.GetReloadToken(), () => { Change(); });
            }
            private static void Compute()
            {
                _appSetting.CorsPolicy = ConfigObjectManager.Instance.AppSetting.GetSection(ConstFiles.AppSettings_CorsPolicy).Get<CorsPolicyOptions>();
            }
            private static void Change()
            {

            }
        }

        #region Object Propertries
        public CorsPolicyOptions CorsPolicy { get; private set; }
        #endregion
    }

4)配置CORS

public static void Config(IServiceCollection services)
        {
            if (AppSetting.Instance.CorsPolicy != null)
            {
                services.AddCors(options =>
                {
                    options.AddDefaultPolicy(bd =>
                    {
                        if ("*" == AppSetting.Instance.CorsPolicy.AllowOrigins)
                        {
                            bd.SetIsOriginAllowed(_ => true);
                        }
                        else
                        {
                            var _tmpArray = AppSetting.Instance.CorsPolicy.AllowOrigins.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                            bd.WithOrigins(_tmpArray);
                        }

                        if (AppSetting.Instance.CorsPolicy.AllowCredentials)
                        {
                            bd.AllowCredentials();
                        }
                        else
                        {
                            bd.DisallowCredentials();
                        }

                        var _tmpMethods = AppSetting.Instance.CorsPolicy.AllowMethods.IsNotNullEmptyWhiteSpace() ? AppSetting.Instance.CorsPolicy.AllowMethods : "GET,PUT,POST,DELETE,HEAD,OPTIONS";
                        bd.WithMethods(_tmpMethods);

                        var _tmpHeaders = AppSetting.Instance.CorsPolicy.AllowHeaders.IsNotNullEmptyWhiteSpace() ? AppSetting.Instance.CorsPolicy.AllowHeaders : "X-Requested-With,origin,content-length,content-type,accept,Authorization,ApplicationType,LanguageType";
                        bd.WithHeaders(_tmpHeaders);

                        var _tmpExposedHeaders = AppSetting.Instance.CorsPolicy.ExposeHeaders.IsNotNullEmptyWhiteSpace() ? AppSetting.Instance.CorsPolicy.ExposeHeaders : "";
                        bd.WithExposedHeaders(_tmpExposedHeaders);

                        var _tmpMaxAge = AppSetting.Instance.CorsPolicy.MaxAge > 1440 ? AppSetting.Instance.CorsPolicy.MaxAge : 8640000;
                        bd.SetPreflightMaxAge(TimeSpan.FromSeconds(_tmpMaxAge));
                    });
                });
            }
        }

5)启用CORS

public static void Start(IApplicationBuilder app)
        {
            if (AppSetting.Instance.CorsPolicy != null)
            {
                app.UseCors();
            }
        }

 

总结

 CORS在ASP.NET Core中实现还是比较简单的,只是习惯了不把可以配置化实现的代码写死在代码中,所以才有了上述编码逻辑。在上述代码中,我比较满意巨硬提供把配置文件中的对象转换为类对象这个操作的,想起在ASP.NET 4.x项目中都是手动实现,特别说明:咋ASP.NET 4.x项目中使用的配置文件格式ini。

 

标签:跨域,2core,Instance,CorsPolicy,AppSetting,static,CORS,public
From: https://www.cnblogs.com/Jkinbor/p/16772096.html

相关文章

  • SQL Server 2000 跨域连接
    原文地址:https://www.cnblogs.com/easypass/archive/2011/04/10/2011043.html一、ping服务器IP能否ping通。这个实际上是看和远程sqlserver2000服务器的物理连......
  • [2core]EFCore对象关系映射
    迁移问题新建一个webapi项目,然后安装EFCore类库,以及ERCore.SqlServer类库,像使用ASP.NET4.x一样采用DBFirst模式,创建ADO.NET实体数据模型。步骤没有错,可此时VS2022提示“......
  • 跨域
    1.什么是跨域不同源之间的数据访问称之为跨域当跨域访问数据时,如果没有特地做过处理,则无法获取不同源的数据(通过标签引用js,img,css是可以的,因为虽然我们通......
  • http-server 服务配置跨域
    http-server--cors-p9999http-server--cors-p9999-c-1 长风破浪会有时,直挂云帆济沧海......
  • 浏览器的跨域
    浏览器报错CORS请求不是http火狐浏览器设置步骤:1.进入火狐配置页进行设置,地址栏输入"about:config"2.点击”我了解此风险”后进入页面3.搜索”security.fileuri.......
  • 记一次SpringBoot中跨域的小问题
    记一次SpringBoot中跨域的小问题问题前阵子,有个学长在跨域的时候遇到一个问题,我们两个人互相讨论了一番,得到了问题的答案。问题如下:如果按照上图的方式配置跨域类,那么......
  • 跨域
    //创建路由规则//request是请求报文的封装//response是响应报文的封装app.get('/server',(request,response)=>{//设置响应头设置允许跨域response.setHead......
  • 跨域访问
    搞代码搞不通,直接在IIS、Nginx添加IISHTTP响应标头添加Access-Control-Allow-Headers值*Access-Control-Allow-Methods值OPTIONS,P......
  • #yyds干货盘点#最新前端跨域实践方案
    nginx反向代理接口跨域跨域原理:同源策略是浏览器的安全策略,不是HTTP协议的一部分。服务器端调用HTTP接口只是使用HTTP协议,不会执行JS脚本,不需要同源策略,也就不存在跨越问题......
  • 什么是跨域?为什么会出现跨域?如何解决跨域问题?
    什么是跨域?是指一个资源去访问另一个不同协议或不同域名或同域名不同端口号是会发出跨域请求,跨域是指浏览器不能执行其他网站的脚本,是由浏览器的同源策略造成的,是浏览......