在ApiController中

时间:2016-01-12 09:42:34

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

我有一个使用OWIN和Web Api 2控制器的REST API。我需要公开一个Authenticate方法,但仅限于来自托管AngularJS应用程序的Web服务器(与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配置似乎是策略的一揽子应用,通过OWIN CorsPolicy类中的app.UseCors(CorsPolicy.AllowAll)类和Startup

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

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

1 个答案:

答案 0 :(得分:1)

简单的答案是,你做不到。 OWIN中间件不是为此而设计的。它完全不适用于应用程序。并不是OWIN CORS与ASP.NET CORS不兼容,它们只是存在于管道内的不同范围内,并且彼此不了解。所以你不能只是在一个方法上放置一个属性或以某种方式装饰一个方法,以便CORS忽略它。

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

抱歉,我现在无法给你任何代码。如果我今天晚些时候得到几分钟,我会看看能不能给你一个例子。

希望有所帮助。