启用Web API的多个CORS
问题出现的原因是在Web API中启用多个CORS(跨域资源共享)时,可能会遇到以下问题:在origins参数中使用逗号分隔多个域名时,浏览器(如Chrome)会报错,提示只允许一个值。
解决方法是使用下面的代码来启用多个CORS:
[EnableCors(origins: "http://localhost:59452,http://localhost:25495,http://localhost:8080", headers: "*", methods: "*")]
这段代码将允许通过逗号分隔的多个域名进行跨域请求。如果想允许任意域名进行跨域请求,可以使用origins:"*"。
然而,需要注意的是,某些浏览器(如Chrome)会阻止这种做法,并报错提示只允许一个值。所以,要启用多个CORS,需要使用上述的多个域名的方式来实现。这样做的好处是可以灵活地控制允许的域名,但缺点是需要手动添加每个允许的域名。
相比之下,一种更简单的方法是使用通配符"*"来允许所有域名进行跨域请求。但需要注意的是,使用通配符可能存在安全风险,因为这样会允许任何域名都能访问API,可能导致安全问题。所以,在使用通配符之前,需要仔细考虑安全性问题,并确保API的安全性。
总结起来,要在Web API中启用多个CORS,可以通过使用逗号分隔的多个域名的方式来实现,或者使用通配符"*"来允许所有域名进行跨域请求。但需要注意的是,使用通配符可能存在安全风险,需要确保API的安全性。
Enabling multiple CORS for Web API
问题的出现原因:
在Web API中启用多个CORS时,使用属性参数不允许使用变量,必须使用常量表达式。因此,如果客户端更改其来源或需要添加新的来源,就需要进行代码更改并重新部署到服务器。
解决方法:
作为一种替代方案,可以在WebApiConfig.cs的Register()方法中启用CORS。这样可以在全局范围内启用CORS,但允许动态设置允许的来源。这样可以在数据库中维护一个允许的来源列表,并根据需要进行更新。在任何更改后仍然需要重新启动Web应用程序,但不需要进行代码更改。
解决方法代码示例:
public static class WebApiConfig { private static string GetAllowedOrigins() { //从数据库获取允许的来源并转换为逗号分隔的字符串 return "http://www.example.com,http://localhost:59452,http://localhost:25495"; } public static void Register(HttpConfiguration config) { string origins = GetAllowedOrigins(); var cors = new EnableCorsAttribute(origins, "*", "*"); config.EnableCors(cors); config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
是否有一种方法可以在特定操作中动态使用AllowedOrigins列表而不是全局启用?
可以创建一个实现ICorsPolicyProvider接口的自定义属性,并从配置、数据库等任何源获取来源。
这种方法是否解决了Chrome在列表中允许只有一个来源时的问题?
没有解决。
在Web API中启用多个CORS(Enabling multiple CORS for Web API)
近期在使用Web API时,遇到了一个问题,即只允许一个来源。根据微软的这篇文章,只允许一个来源,因此无法使用逗号分隔的字符串的方法。在测试网站test-cors中可以使用,但在SPFx的web part中无法使用。
此外,通配符(*)的来源在包含cookie/凭据的情况下无法使用(至少在SPFx中)。
根据上述问题,我整理出以下解决方法:
1. 修改Web API的配置文件,允许多个来源。在配置中添加以下代码:
2. 如果想要允许所有来源,可以使用通配符(*)。但要注意,在包含cookie/凭据的情况下,通配符是无效的。
通过以上方法,可以解决Web API只允许一个来源的问题,并且可以启用多个CORS。