【问题标题】:Disable CORS for single method in ApiController在 ApiController 中为单个方法禁用 CORS
【发布时间】:2016-04-16 20:37:00
【问题描述】:

我有一个使用 OWIN 和 Web Api 2 控制器的 REST API。我需要公开一个Authenticate 方法,但仅限于来自托管AngularJS 应用程序的网络服务器(与REST API 相同的主机)的请求,这意味着据我所知,我只需要为该方法禁用CORS .

我的ApiController 类的示例如下(RequireHttpsAttribute 强制执行 SSL URL 请求方案):

[Authorize]
[RequireHttps]
[RoutePrefix("api/v1")]
public class RestController : ApiController
{
    [AllowAnonymous, Route("Authenticate")]
    public async Task<IHttpActionResult> Authenticate([FromBody] AuthenticationModel authenticationModel)
    { ... }

    [HttpGet, Route("SecureData/{id:int}")]
    public async Task<IHttpActionResult> GetSecureData(int id)
    { ... }

    [HttpPost, Route("SecureData")]
    public async Task<IHttpActionResult> CreateSecureData([FromBody] SecureDataModel data)
    { ... }

    [HttpPut, Route("SecureData")]
    public async Task<IHttpActionResult> UpdateSecureData([FromBody] SecureDataModel data)
    { ... }
}

OWIN CORS 配置似乎是通过 CorsPolicy 类和 OWIN Startup 类中的 app.UseCors(CorsPolicy.AllowAll) 全面应用策略。

我找到的资源(包括其他SO问题,例如this one)指出OWIN CORS和ASP.NET CORS互不兼容,所以看起来我不能简单地装饰使用 DisableCorsAttribute 的方法(我目前在我的项目中也没有任何 ASP.NET 依赖项,因此我将为该单个属性添加所有依赖项!)。

我的问题是:如何在 OWIN 中为单个 Web Api 2 控制器方法禁用 CORS?

【问题讨论】:

  • 不会让 cors 在行动层面更容易?
  • 你能详细说明你的意思吗?

标签: c# cors asp.net-web-api2 owin


【解决方案1】:

简单的答案是你不能。 OWIN 中间件的设计目的不是为了做到这一点。它与应用程序完全无关。并不是说 OWIN CORS 与 ASP.NET CORS 不兼容,它们只是存在于管道内的不同范围内并且彼此不知道。因此,您不能只在方法上添加属性或以某种方式装饰方法,使其被 CORS 忽略。

也就是说,更复杂的答案是您可以创建自己的 ICorsPolicyProvider,让它查看路径并决定是否应该使用 CORS。您可以在此处https://katanaproject.codeplex.com 从 CodePlex 克隆 katana 存储库,并查看现有 CorsPolicyProvider.cs 文件如何实现并根据您的目的对其进行修改。

抱歉,我现在不能给你任何代码。如果我今天晚些时候有空,我会看看能不能给你举个例子。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2019-04-25
    相关资源
    最近更新 更多