Ajax CORS策略Asp.NET Core MVC阻止从源站访问Xmlhttprequest
我正在设计一个基于MVC的web应用程序,用作报告仪表板,从几个不同的来源提取数据。除了我的主/视图控制器之外,我还为每个服务/数据源设计了API控制器,并使用Jquery/Ajax查询API端点 我还使用Microsoft.Identity.Web/Web.UI将授权/身份验证添加到我的应用程序中,每个控制器都需要经过身份验证的用户 我遇到的问题是,我的JS发出的请求当然会从我的一个API控制器请求数据,然后API实际上会将我重定向到登录(即使我已经有一个基于cookie的经过身份验证的会话)。重定向被阻止,出现以下错误: 在'https://login.microsoftonline.com/...(从'https://X.X.X.X:XX/v1/MicrosoftPlanner/')源于https://X.X.X.X:XX'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在'access control Allow Origin'标头。 我尝试利用Microsoft的CORS允许重定向,但未成功-我最后一次尝试是允许这样的一切: 配置服务Ajax CORS策略Asp.NET Core MVC阻止从源站访问Xmlhttprequest,ajax,asp.net-core-mvc,asp.net-core-webapi,Ajax,Asp.net Core Mvc,Asp.net Core Webapi,我正在设计一个基于MVC的web应用程序,用作报告仪表板,从几个不同的来源提取数据。除了我的主/视图控制器之外,我还为每个服务/数据源设计了API控制器,并使用Jquery/Ajax查询API端点 我还使用Microsoft.Identity.Web/Web.UI将授权/身份验证添加到我的应用程序中,每个控制器都需要经过身份验证的用户 我遇到的问题是,我的JS发出的请求当然会从我的一个API控制器请求数据,然后API实际上会将我重定向到登录(即使我已经有一个基于cookie的经过身份验证的会话)
public void ConfigureServices(IServiceCollection services)
{
string[] initialScopes = Configuration.GetValue<string>("DownstreamApi:Scopes")?.Split(' ');
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi(initialScopes)
.AddMicrosoftGraph(Configuration.GetSection("DownstreamApi"))
.AddInMemoryTokenCaches();
services.Configure<ParkMyCloudApiCredentials>(Configuration.GetSection("ParkMyCloud"));
services.Configure<ServiceNowApiCredentials>(Configuration.GetSection("ServiceNow"));
services.AddCors();
services.AddControllersWithViews(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
services.AddRazorPages()
.AddMicrosoftIdentityUI();
services.AddOptions();
}
我将在此处退出Microsoft文档:
我的理解是,这绝对是限制性最小的,因此应该作为一个基本案例,取得成功。然而,目前还没有找到解决办法
我知道我可能会使用代理,但我正试图避免采取变通办法
我也看过这里的其他帖子,到目前为止,我还没有看到一个同样适用于我的解决方案。从中,我们可以看到:
CORS飞行前请求用于确定所请求的资源是否设置为由服务器跨源共享。而且选项请求总是匿名的,如果未启用匿名身份验证,服务器将无法正确响应飞行前请求
访问位于的XMLHttpRequest
'https://login.microsoftonline.com/...(从
'https://X.X.X.X:XX/v1/MicrosoftPlanner/""""来源"
'https://X.X.X.X:XX'已被CORS策略阻止:响应
飞行前请求未通过访问控制检查:否
“Access Control Allow Origin”标头出现在请求的服务器上
资源
要解决上述问题,如果您在本地运行应用程序,以便使用CORS进行测试,则可以尝试启用匿名身份验证
此外,如果您的应用程序托管在IIS上,您可以尝试为该应用程序安装和配置CORS。从中,我们可以看到:
CORS飞行前请求用于确定所请求的资源是否设置为由服务器跨源共享。而且选项请求总是匿名的,如果未启用匿名身份验证,服务器将无法正确响应飞行前请求
访问位于的XMLHttpRequest
'https://login.microsoftonline.com/...(从
'https://X.X.X.X:XX/v1/MicrosoftPlanner/""""来源"
'https://X.X.X.X:XX'已被CORS策略阻止:响应
飞行前请求未通过访问控制检查:否
“Access Control Allow Origin”标头出现在请求的服务器上
资源
要解决上述问题,如果您在本地运行应用程序,以便使用CORS进行测试,则可以尝试启用匿名身份验证
此外,如果你的应用程序托管在IIS上,你可以尝试为该应用程序安装和配置CORS。我联系了Microsoft开发帮助,结果发现你无法将CORS策略应用于Azure AD登录端点。我正在尝试使用ADAL/MSAL.JS隐式授权流解决问题。我联系了Microsoft开发帮助,结果发现您无法将CORS策略应用于Azure AD登录端点。我正在尝试使用ADAL/MSAL.JS隐式授权流解决问题。感谢您的回复。我试了你的建议。我已经启用了匿名身份验证,但我已将CORS模块安装到我的IIS服务器上,重新运行设置,但仍然无法解决此问题。感谢您的回复。我试了你的建议。我已经启用了匿名身份验证,但是我将CORS模块安装到了我的IIS服务器上,重新运行设置,仍然无法克服这个问题。(选项5部分)还指出,如果此问题特定于login.microsoftonline.com重定向,则无法解决此问题。您是否能够找到解决方法?我能够解决我的问题,但无法通过前端JS解决。我最终实际做的是将应用程序拆分为一个解决方案中的两个独立项目——一个MVC客户端网站和一个Web API。API已在Azure AD中注册,并且我的客户端站点在AD中具有代表用户向API请求令牌的权限。没有能力利用JavaScript来持久化页面—只是用静默请求更新内容—我必须在a方面有点创造性。将数据从C#传输到JS和B。保持请求之间的连续性。API现在连接到所有第三方接口。这绕过了我的CORS问题,因为请求现在都发生在服务器端,现在我在请求中使用了JWT,因此不需要重定向到Microsoft登录端点。(选项5部分)还指出,如果此问题特定于login.microsoftonline.com重定向,则无法解决此问题。您是否能够找到解决方法?我能够解决我的问题,但无法通过前端JS解决。我最终实际做的是将应用程序拆分为一个解决方案中的两个独立项目——一个MVC客户端网站和一个Web API。API已在Azure AD中注册,并且我的客户端站点在AD中具有代表用户向API请求令牌的权限。如果没有利用JavaScript来持久化页面的能力——只是用静默请求更新内容——我不得不这样做
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.CongfigureExceptionHandler();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCors(builder =>
{
builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
}