owin cors 或 web api cors
Posted
技术标签:
【中文标题】owin cors 或 web api cors【英文标题】:owin cors or web api cors 【发布时间】:2015-02-03 05:44:06 【问题描述】:关于 CORS on web-api 的问题有 100 多个,关于如何启用 CORS,每个问题都有不同的答案。我很困惑,不知道哪个答案是正确的。问题是没有一个答案能准确地解释每一行代码的作用,这样我就可以理解和解决我的问题,而不是复制粘贴代码。
无论如何,问题是:我正在使用 owin 使用 asp.net web api 2。我需要启用 CORS。我该怎么做? OWIN 有 cors 设置
application.UseCors(CorsOptions.AllowAll);
还有 asp.net web api 的 cors 设置
var cors = new EnableCorsAttribute("*", "*", "*", "*");
config.EnableCors(cors);
鉴于我没有使用 OAUTH,我应该使用哪一个(我之所以指定这一点,是因为当我们使用 OAUTH 和不使用 OAUTH 时,SO 上的答案会有所不同)。
我需要为 OWIN 和 WEB-API 启用 CORS 还是只为其中之一启用 CORS。如果两者都启用,则会出现问题,read here
如果有人能解释一下两者之间的区别,那将非常有帮助
-
欧文CORS
WEB API CORS
使用 OWIN/WEBAPI 和 OAUTH 的 CORS
还有针对 owin 托管的 web-api 的自托管 web api 的答案,这进一步增加了 confution :(,对不起,咆哮
【问题讨论】:
同意,如果有人能解释清楚,那就太好了。 我仍在寻找答案.. 给出的答案不完整且不切题。我不是在寻找如何去做,那就是还有很多其他的答案 【参考方案1】:如果您需要 CORS 应用于您的 API 控制器,您应该使用 Web API's CORS
。对于其他所有内容(例如令牌服务),您不得不使用 Owin.Cors
。
如果您最终同时使用两者,则需要确保它们不重叠,并为同一请求应用 CORS 两次。
Web API 2.2
通过提供EnableCorsAttribute
可以轻松启用CORS。
基本用法
[EnableCors("*", "*", "*")]
public class ResourcesController : ApiController
...
属性定义
[AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Method, AllowMultiple = false)]
public EnableCorsAttribute(
string origins,
string headers,
string methods
)
启用 CORS 全局使用
public static class WebApiConfig
public static void Register(HttpConfiguration config)
var cors = new EnableCorsAttribute("www.example.com", "*", "*");
config.EnableCors(cors);
// ...
您还需要从 nuget 安装 CORS 包
Install-Package Microsoft.AspNet.WebApi.Cors
【讨论】:
我知道如何在 web-api 上启用 cors,我想知道的是,web-api 和 owin cors 之间的区别,什么时候使用。它不是关于如何/在哪里启用它.... Web API 的 CORS 仅支持控制器,其他一切都需要使用 Owin.Cors。 什么是everything else
安全令牌服务就是一个例子。这不在控制器之下。
为什么不呢?它回答了问题并提供了一些额外的信息。【参考方案2】:
有办法解决这个问题。由于 OWIN 和 ASP.NET.CORS 库同时工作。 Owin 令牌或身份验证方法需要配置为独立于所有其他 API 控制器启用 CORS。
首先,不要在 Startup.cs 中将 cors 与 Owin 一起使用:
public void Configuration(IAppBuilder app)
//app.UseCors(CorsOptions.AllowAll);
找到 GrantResourceOwnerCredentials 方法并将 Access-Control-Allow-Origin 添加到上下文中,这样当它在身份验证完成后返回调用时,浏览器会找到并接受它。
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] "http://localhost" );
现在将 Microsoft.AspNet.WebApi.Cors 包从 Nuget 安装到您的 webapi 项目,并将其添加到注册方法
public static void Register(HttpConfiguration config)
var cors = new EnableCorsAttribute("http://localhost, ", "accept,accesstoken,authorization,cache-control,pragma,content-type,origin", "GET,PUT,POST,DELETE,TRACE,HEAD,OPTIONS");
config.EnableCors(cors);
为我工作。
【讨论】:
非常感谢。在调试 OWIN 和 WebAPI cors 冲突后,你的回答拯救了我的一天 这也解决了我的问题,这个问题的原因确实是Owin。谢谢以上是关于owin cors 或 web api cors的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft Owin Cors允许所有不能在Chrome for Web API中使用
Web Api 2 和 Angular 之间的 CORS 错误