.NET API如何为默认/Token端点启用CORS?
解决.NET API中/Token端点的跨域问题
这个问题我太熟悉了!你遇到的核心原因是:默认的/Token端点并不是由Web API控制器处理的,它是由OAuthAuthorizationServerMiddleware这个OWIN中间件负责处理的,所以你之前针对Web API控制器配置的CORS(不管是WebApiConfig里的全局配置,还是控制器上的[EnableCors]特性)都对它不起作用。
下面是两种可靠的解决方法:
方法一:使用OWIN CORS中间件(最简单的全局允许)
这是最直接的方案,步骤如下:
首先安装OWIN CORS包:
在NuGet包管理器中安装Microsoft.Owin.Cors,或者用Package Manager Console执行:Install-Package Microsoft.Owin.Cors在你的OWIN Startup类(通常是
Startup.cs或者Startup.Auth.cs)中,在OAuth授权服务器中间件之前注册CORS中间件。OWIN管道是按注册顺序执行的,CORS必须先处理请求,才能在响应头中注入跨域所需的字段。示例代码:
public void Configuration(IAppBuilder app) { // 第一步:注册CORS中间件,必须放在OAuth之前 app.UseCors(CorsOptions.AllowAll); // 第二步:配置Web API var config = new HttpConfiguration(); WebApiConfig.Register(config); app.UseWebApi(config); // 第三步:配置OAuth授权服务器(包含/Token端点) ConfigureOAuth(app); } private void ConfigureOAuth(IAppBuilder app) { var oAuthOptions = new OAuthAuthorizationServerOptions { AllowInsecureHttp = true, TokenEndpointPath = new PathString("/Token"), AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), Provider = new YourCustomAuthorizationServerProvider() }; // 启用OAuth授权服务和Bearer认证 app.UseOAuthAuthorizationServer(oAuthOptions); app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); }
方法二:自定义细粒度的CORS策略
如果你不想全局允许所有域名,而是要指定特定的源、方法或头,可以自定义CORS策略:
public void Configuration(IAppBuilder app) { // 自定义CORS策略 var customCorsPolicy = new CorsPolicy { AllowAnyHeader = true, AllowAnyMethod = true, // 指定允许跨域的前端域名,多个的话直接加在集合里 Origins = { "http://your-frontend-app.com", "https://another-frontend-domain.com" } }; // 注册自定义策略的CORS中间件 app.UseCors(new CorsOptions { PolicyProvider = new CorsPolicyProvider { PolicyResolver = context => Task.FromResult(customCorsPolicy) } }); // 后续的Web API和OAuth配置和方法一一致 var config = new HttpConfiguration(); WebApiConfig.Register(config); app.UseWebApi(config); ConfigureOAuth(app); }
关键注意事项
- 一定要保证CORS中间件的注册顺序在
app.UseOAuthAuthorizationServer之前,否则跨域请求的预检查(OPTIONS请求)会先被OAuth中间件拦截,无法返回正确的CORS响应头。 - 你之前针对Web API控制器配置的CORS可以保留,两者互不冲突:OWIN CORS处理整个管道的请求(包括/Token),而Web API的CORS只针对控制器端点。
内容的提问来源于stack exchange,提问作者Colonel Mustard
相关产品推荐
相关产品推荐

