Dav*_*vid 15 c# cross-domain-policy cors asp.net-core asp.net-core-webapi
这将是Access-Control-Allow-Origin标头如何工作的重复?,但那里的方法也不适合我.我希望我只是遗漏了一些东西.
我试图Access-Control-Allow-Origin通过我的.NET Core Web API在我的响应中获得一个标题,我通过AJAX访问它.
我尝试过几件事.除非另有说明,否则所有内容都在Startup.cs文件中.
方法1
根据Microsoft文档:
public void ConfigureServices(IServiceCollection services)
{
// Add database
services.AddDbContext<DbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DbConnection")));
// Add the ability to use the API with JSON
services.AddCors();
// Add framework services.
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (env.IsDevelopment())
{
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
serviceScope.ServiceProvider.GetService<DbContext>().Database.Migrate();
serviceScope.ServiceProvider.GetService<DbContext>().EnsureSeedData();
}
}
app.UseCors(builder => builder.WithOrigins("https://localhost:44306").AllowAnyMethod());
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"],
Audience = Configuration["Authentication:AzureAd:Audience"],
});
app.UseMvc();
}
Run Code Online (Sandbox Code Playgroud)
方法2
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddCors(options => options.AddPolicy("AllowWebApp",
builder => builder.AllowAnyMethod()
.AllowAnyMethod()
.AllowAnyOrigin()));
//.WithOrigins("https://localhost:44306")));
// ...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// ...
app.UseCors("AllowWebApp");
// ...
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过添加[EnableCors("AllowWebApp")]Controller和Method.
从Postman,我得到:
content-encoding→gzip
content-type→text/plain; charset = utf-8
date→Wed,2017年1月25日04:51:48 GMT
服务器→红隼
状态→200
变化→接受编码
x-powered-by→ASP.NET
x-sourcefiles→=?UTF-8?B? [删除]
我也在Chrome中尝试过,并获得了类似的标题.
如果重要,我试图访问的方法有一个Authorize属性.但那部分应该工作正常(我至少得到了很好的回应)
那么,我是否遗漏了一些非常明显的东西,或者这是否会被打破?我目前正在运行1.1.0版.
编辑添加JS和Controller Stub
function getContactPreviews(resultsCallback) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = () => {
if (xmlhttp.readyState == XMLHttpRequest.DONE && xmlhttp.status == 200) {
resultsCallback(JSON.parse(xmlhttp.response));
}
}
xmlhttp.open("GET", "https://localhost:44357/api/User/ContactsPreview", true);
xmlhttp.setRequestHeader("Authorization", "Bearer " + localStorage.getItem("AuthorizationToken"));
xmlhttp.send();
}
Run Code Online (Sandbox Code Playgroud)
控制器存根
[Authorize]
[Route("api/[controller]")]
public class UserController : ApiController
{
[HttpGet(nameof(ContactsPreview))]
[EnableCors("AllowWebApp")]
public IEnumerable<Customer> ContactsPreview()
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*vid 24
问题是当使用Bearer身份验证(或任何我想象的)时,它会添加一个标题"Authorization",如果设置允许该标头,服务器将只提供一个正常的.
有两种方法可以解决问题,下面是唯一需要的代码.它包含在Web API解决方案中的Configure()方法中Startup.cs.
方法1:允许所有标头
app.UseCors(builder => builder.WithOrigins("https://localhost:44306")
.AllowAnyMethod()
.AllowAnyHeader());
Run Code Online (Sandbox Code Playgroud)
方法2:允许特定标头
app.UseCors(builder => builder.WithOrigins("https://localhost:44306")
.AllowAnyMethod()
.WithHeaders("authorization", "accept", "content-type", "origin"));
Run Code Online (Sandbox Code Playgroud)
额外的标题是因为,根据文档:
浏览器在设置Access-Control-Request-Headers方面并不完全一致.如果将标题设置为"*"以外的任何标题,则应至少包括"accept","content-type"和"origin",以及您要支持的任何自定义标题.
| 归档时间: |
|
| 查看次数: |
15034 次 |
| 最近记录: |