IIS中托管的WebAPI中的CORS问题

IIS中托管的WebAPI中的CORS问题,iis,asp.net-web-api,cors,preflight,Iis,Asp.net Web Api,Cors,Preflight,我正在尝试实现一个应用程序,它使用Taiseer Joudeh在本文中演示的相同的基于令牌的身份验证机制 在我的申请中,我不断遇到Cors问题。在某些配置中,我会在POST获取令牌的飞行前(选项)请求中收到500个错误,或者我可以获取令牌,但在使用承载令牌的实际API调用的飞行前请求中收到404个错误 一个区别是Taiseer的代码被设置为在IISExpress(或Azure)中托管,而我的代码则托管在本地IIS上(目前运行在Windows7上) 凭直觉,我尝试在本地IIS下托管他的API,我发

我正在尝试实现一个应用程序,它使用Taiseer Joudeh在本文中演示的相同的基于令牌的身份验证机制

在我的申请中,我不断遇到Cors问题。在某些配置中,我会在POST获取令牌的飞行前(选项)请求中收到500个错误,或者我可以获取令牌,但在使用承载令牌的实际API调用的飞行前请求中收到404个错误

一个区别是Taiseer的代码被设置为在IISExpress(或Azure)中托管,而我的代码则托管在本地IIS上(目前运行在Windows7上)

凭直觉,我尝试在本地IIS下托管他的API,我发现了完全相同的问题。(飞行前请求令牌时出现500个错误,看起来实际API将正常工作)

据我所知,IIS中的模块和处理程序与WebApi中的Cors实现之间似乎存在一些冲突,但Taiseer的实现在Azure中托管时可以工作,因此可能是IIS版本的不同(我目前在Windows 7下运行)


如何找出问题的原因?

这不是您使用的IdentityServer,但可能是同一个问题。关于IdentityServer,在IIS下运行时,您必须为应用程序激活RAMMFAR(runAllManagedModulesForAllRequests)

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
  </modules>
</system.webServer>

问题的根源 令牌操作不是托管在控制器中,而是内置在较低级别管道中的某个位置。对该机制的唯一访问是通过扩展
OAuthAuthorizationServerProvider
的类中的重写方法
GrantResourceOwnerCredentials()
。(在我们的例子中是
ApplicationAuthProvider.cs

GrantResourceOwnerCredentials()
确实具有可用的上下文,但它未作为飞行前请求的一部分调用,因此您无法为COR插入适当的飞行前响应标头

解决方案 我们最终确定了以下解决方案。我不是一个很喜欢它的人,因为它会将这些标题强制加入到每个响应中,但至少它是有效的

解决方案是重写Global.asax中的Application_PreSendRequestHeaders()方法以插入适当的头

Global.asax.cs
void应用程序\u呈现请求标头(对象发送方,事件参数e)
{
var origin=Request.Headers.Get(“origin”);
var validOrigins=ConfigurationManager.AppSettings[“allowedCorsOrigins”]。拆分(',');
if(validOrigins.Any(o=>o==origin))
{
Response.Headers.Set(“访问控制允许原点”,原点);
Response.Headers.Set(“访问控制允许凭据”、“true”);
Set(“访问控制允许标头”、“内容类型、接受、授权、带凭据、首选”);
Set(“访问控制公开头”,“声明,*”);
Response.Headers.Set(“访问控制最大年龄”,“600”);
Set(“访问控制允许方法”、“获取、放置、发布、删除、选项”);
}
}
这需要以下web.config条目:

web.config



    • 我也有同样的问题,我按照汤姆·霍尔先生的建议做了一切。但chrome仍报告不存在访问控制允许原始标头。。在使用fidler进行检查后,我意识到我的请求通过代理服务器,而我的代理服务器正在处理飞行前选项请求


      因此,在“internet选项”中,我删除了代理服务器,发现一切都正常运行

      您必须更具体地说明所遇到的错误。调查导致500服务器错误的异常(如果需要,尝试远程调试),或者如果没有,则在日志中查找IIS内部错误。我们目前没有足够的信息来帮助您。您应该接受您的答案以结束此问题。与此同时,微软后来为这类应用提供了IIS CORS模块,