将Azure AD集成到ASP.NET Core MVC Web应用程序会导致对JavaScript前端向ASP.NET控制器发出的请求进行跨源读取阻止。
我正在编写一个ASP.NET核心MVC应用程序,要求用户使用Microsoft工作帐户登录。这有效。我将以下代码添加到Startup.cs:
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddAzureAd(options => Configuration.Bind("AzureAd", options))
.AddCookie(options =>
{
options.LoginPath = "/Account/SignIn/";
options.AccessDeniedPath = "/Account/AccessDenied/";
});
我还在为应用程序用户界面使用Telerik UI小部件。因此,我有多个地方使用JavaScript向ASP.NET控制器发出请求。例如:
function onEvent(e) {
$.post("Controller/Foo", function (data) {
...
});
}
当我使用IIS Express在本地运行和调试时,这很有用但是当我将应用程序部署到运行IIS的服务器时,我开始在我的浏览器开发工具中收到有关跨源读取阻塞的警告,而我的javascript函数都没有发出请求我的ASP.NET控制器接收数据。
以下是警告的屏幕截图:
如果有人碰巧知道如何处理这个问题,我将非常感激;我是所有这一切的新手,我不知道从哪个特定问题开始。
我目前的想法是要么我需要弄清楚如何在javascript中处理'Access-Control-Allow-Origin'标头,或者在Azure中需要做些什么。
我做的第一件事是在我的应用程序中启用CORS,但这只允许其他域从我的应用程序发出跨源请求,这不是这里发生的事情。
如果有人在Chrome和dotnet核心中遇到CORB这个问题请注意,在我的情况下,我使用的是ResponseCache属性。在第一个非缓存的请求上它起作用,后续的请求因CORB错误而失败。
删除属性后,错误就消失了。
这并不能解决问题,但可以就问题的位置给出一个方向。
因为不再需要响应缓存,所以我没有打扰它。
以下是违规代码
[ResponseCache(Duration = 15, Location = ResponseCacheLocation.Any, VaryByQueryKeys = new[] {"key", "type", "identifier", "app"})]