在 Authorization 标头中显式设置令牌值是一种较为安全的身份验证方法,因为您可以避免遭受“跨网站请求伪造”(CSRF) 攻击。 您可在 Visual Studio 2013 新增的单页应用程序 (SPA) 模板中看到这种方法。
至此,您已经了解了 HTTP 级别上的 CORS 基础知识,接下来,我将向您说明如何使用新的 CORS 框架从 Web API 发出这些标头。
Web API 2 对 CORS 的支持
Web API 中对 CORS 的支持是一个完整框架,允许应用程序定义 CORS 请求的权限。 该框架围绕一个策略方案展开,该策略方案可让您指定针对进入应用程序的任何给定请求而允许的 CORS 功能。
首先,为了获取该 CORS 框架,您必须从 Web API 应用程序引用 CORS 库(默认情况下,Visual Studio 2013 中的任何 Web API 模板都不引用这些库)。 该 Web API CORS 框架通过 NuGet 作为 Microsoft.AspNet.WebApi.Cors 程序包提供。 如果您不使用 NuGet,则该框架也可作为 Visual Studio 2013 的一部分提供,并且您需要引用两个程序集:System.Web.Http.Cors.dll 和 System.Web.Cors.dll(在我的计算机上,这两个程序集位于 C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Stack 5\Packages)。
接下来,为了表达该策略,Web API 提供了一个名为 EnableCorsAttribute 的自定义属性类。 此类包含允许的域、HTTP 方法、请求标头、响应标头以及是否允许使用凭据等方面的属性(它们对前面所述的 CORS 规范的所有详细信息进行建模)。
最后,为了让 Web API CORS 框架处理 CORS 请求并发出适当的 CORS 响应标头,该类必须检查进入应用程序的每个请求。 Web API 通过消息处理程序提供用于这种拦截操作的扩展点。 Web API CORS 框架会相应地实现一个名为 CorsMessageHandler 的消息处理程序。 对于 CORS 请求,该处理程序会查询在所调用方法的属性中表达的策略,并发出适当的 CORS 响应标头。
EnableCorsAttribute。EnableCorsAttribute 类就是应用程序表达其 CORS 策略的方式。 EnableCorsAttribute 类有一个可接受三个或四个参数的重载构造函数。 这些参数(依次)为:
- 允许域列表
- 允许请求标头列表
- 允许 HTTP 方法列表
- 允许响应标头列表(可选)
还有一个允许使用凭据的属性 (SupportsCredentials) 以及另一个用于指定预检缓存持续时间值的属性 (PreflightMaxAge)。
图 2 显示了将 EnableCors 属性应用于控制器上各种方法的示例。 用于各种 CORS 策略设置的值应该与前面的示例中说明的 CORS 请求和响应匹配。
图 2 将 EnableCors 属性应用于操作方法