如何以完美的方式使用cors



我正在尝试集成不同的技术(每个技术都有不同的领域)并创建RESTfull操作。例如,我有一个客户端(Apache cordova)和一个服务器(.NET framework 4.6.1)。在WebGet方法中,所有方法都可以正常工作,但在其他方法中则不然。 这是我的登录操作测试代码。

Javascript(angular)

$http({
method: 'Put',
url: $rootScope.url + '/Login'
}).then(function successCallback(response) {
}, function errorCallback(response) {
});

变量 $rootScope.url 具有服务器正在运行的 URL。

C# MVC .NET

[HttpPut]
[AllowAnonymous]
public async Task<ActionResult> Login()
{
try
{
var result = await SignInManager.PasswordSignInAsync("test3", "1!2@Qa", false, shouldLockout: false);
return null;
}
catch (Exception ex)
{
throw ex;
}
}

当我在网络中拨打此电话时,我得到这个

http://localhost:4400/xhr_proxy?rurl=http%3A//localhost%3A49266/App//Login.

通过一些谷歌搜索,我发现同源策略是此AJAX调用失败的原因。

看这篇文章,我明白了我们应该使用 CORS 的原因。但是我不明白如何在生产环境中使用它们的完美方法。

如何确定我的服务器仅接受来自客户端的呼叫?我必须向客户端 javascript 调用添加一个自定义标头,服务器将检查是否存在?

我找到了一些解决方案,例如HttpContext.Response.AppendHeader("Access-Control-Allow-Origin", "*");

<httpProtocol>
<customHeaders>
<clear />
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>

但我认为使用这种方式,我会让任何带有 javascript 的站点对服务器进行操作。

如何创建安全的 cors 策略?

您是对的,使用 * 将允许任何站点使用您的 API。相反,您希望将 * 替换为完全限定的域,例如https://www.{domain}.com。如果您有多个域/子域,也可以提供逗号分隔的列表。

此外,如果您有正在使用的特定集合,也可以限制标头和方法。以下是更多信息:https://learn.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api

相关内容

  • 没有找到相关文章

最新更新