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中使用

cors c# web API react

为 ASP API 令牌请求启用 CORS

Web Api 2 和 Angular 之间的 CORS 错误

在 Azure Web 应用/Azure API 上部署时缺少 CORS 标头

使用 OWIN 将 Web API 托管为 Windows 服务