我们有一个由3个不同网站组成的客户项目,我们希望尽可能多地重复使用代码。我们有一个项目包含大量的Angular JavaScript /模板用于指令等。
我们正在使用ASP.NET 4和Angular 1.5.5。
我能够使用启用了CORS的绝对URL来渲染项目2中项目1中保存的模板。
但是,我们还使用请求拦截器使用请求标头对应用程序之间的单点登录进行身份验证。这会阻止跨域模板被转移到Project 2中,并显示以下错误:
XMLHttpRequest cannot load https://localhost:44302/path/to/template.html. Response for preflight has invalid HTTP status code 405
。
如果我删除了设置“授权”标头的代码,则该模板可以完美地跨域运行。
看起来请求与拦截器的唯一区别是它有以下标题:
access-control-request-headers:authorization
access-control-request-method:GET
这会导致模板无法加载吗?
答案 0 :(得分:1)
这是通过在ASP.NET Web端而不是Angular端设置CORS来解决的。
我们使用私有方法在Startup.cs文件中启用它。我们有一个名为Cors.AllowedOrigins
的Web.config设置,其中包含一个;
分隔的字符串,其中包含我们希望在CORS中允许的每个应用程序。
private void EnableCors(IAppBuilder app)
{
var policy = new CorsPolicy
{
AllowAnyMethod = true,
AllowAnyHeader = true
};
var origins = ConfigurationManager.AppSettings["Cors.AllowedOrigins"];
if (origins != null)
{
foreach (var origin in origins.Split(';'))
{
policy.Origins.Add(origin);
}
}
else
{
policy.AllowAnyOrigin = true;
}
var corsOptions = new CorsOptions
{
PolicyProvider = new CorsPolicyProvider
{
PolicyResolver = context => Task.FromResult(policy)
}
};
app.UseCors(corsOptions);
}
我们在Configuration方法中调用了它,传递了IAppBuilder
。
答案 1 :(得分:0)
添加标题会使浏览器发出预检OPTIONS请求,服务器会为该OPTIONS请求返回405。浏览器然后中止"真实"请求。只需简单的请求即可,无需此预检请求。您只能使用limited set of headers to qualify as simple request
如果您可以在同一个域和端口上提供模板,则它不会是CORS请求,也不会进行此预检请求。如果没有,您可以使用this guide向OPTIONS请求发送正确的回复。