- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在构建的网络应用程序遇到问题。该 Web 应用程序由 Angular 4 前端和 dotnet core RESTful API 后端组成。需求之一是对后端的请求需要使用SSL相互认证进行认证;即客户端证书。
目前,我将前端和后端托管为 Azure 应用服务,并且它们位于不同的子域上。
按照本指南将后端设置为需要客户端证书,我相信这是对 Azure 应用服务执行此操作的唯一方法: https://learn.microsoft.com/en-us/azure/app-service/app-service-web-configure-tls-mutual-auth
当前端向后端发出请求时,我将 withCredentials
设置为 true
— [根据文档][1],这也应该与客户端证书一起使用.
The XMLHttpRequest.withCredentials property is a Boolean that indicates whether or not cross-site Access-Control requests should be made using credentials such as cookies, authorization headers or TLS client certificates. Setting withCredentials has no effect on same-site requests.
前端相关代码:
const headers = new Headers({ 'Content-Type': 'application/json' });
const options = new RequestOptions({ headers, withCredentials: true });
let apiEndpoint = environment.secureApiEndpoint + '/api/transactions/stored-transactions/';
return this.authHttp.get(apiEndpoint, JSON.stringify(transactionSearchModel), options)
.map((response: Response) => {
return response.json();
})
.catch(this.handleErrorObservable);
在 Chrome 上,这是可行的,当发出请求时,浏览器会提示用户输入证书,并将其包含在预检请求中,一切正常。
对于所有其他主要浏览器,情况并非如此。 Firefox、Edge 和 Safari 都会使预检请求失败,因为当它们在请求中不包含客户端证书时,服务器会关闭连接。
直接浏览到 api 端点会使每个浏览器提示用户输入证书,因此我非常确定这与大多数浏览器使用客户端证书处理预检请求的方式明确相关。
我做错什么了吗?还是其他浏览器在发出请求时不提示输入证书而做错了事情?
我需要支持除 Chrome 之外的其他浏览器,因此我需要以某种方式解决这个问题。
我已经看到通过让后端允许而不是要求证书来解决类似的问题。唯一的问题是我还没有找到一种方法来实际使用 Azure 应用服务来做到这一点。要么需要,要么不需要。
有人对我如何继续前进有任何建议吗?
最佳答案
参见https://bugzilla.mozilla.org/show_bug.cgi?id=1019603以及我在CORS with client https certificates的答案中的评论(我忘记了我之前看到过同样的问题报告......)。
最重要的是,您所看到的差异的原因是 Chrome 中的错误。我已在 https://bugs.chromium.org/p/chromium/issues/detail?id=775438 上提交了一个错误.
问题在于 Chrome 没有遵循这方面的规范要求,该规范要求浏览器不得在预检请求中发送 TLS 客户端证书;因此 Chrome 会在预检中发送您的 TLS 客户端证书。
Firefox/Edge/Safari 遵循规范要求,并且不在预检中发送 TLS 客户端证书。
<小时/>更新:在问题编辑中添加的 Chrome 屏幕截图显示了针对 GET
请求的 OPTIONS
请求,以及后续的 GET
请求 — 不是来自代码的 POST
请求。所以问题可能在于服务器禁止 POST
请求。
/image/GD8iG.png中显示的请求是 CORS preflight OPTIONS
request在尝试代码中的 POST
请求之前,浏览器会自动发送。
您的代码添加的 Content-Type: application/json
请求 header 会触发浏览器发出预检 OPTIONS
请求。
重要的是要了解浏览器永远不会包含任何 credentials在该预检 OPTIONS
请求中 - 因此请求发送到的服务器必须配置为不需要对 /api/transactions 的
。OPTIONS
请求进行任何凭据/身份验证/自己的交易/
但是,从 /image/GD8iG.png看来服务器禁止向该 /api/transactions/own-transactions/
发出 OPTIONS
请求。也许是因为请求缺少服务器期望的凭据,或者可能是因为服务器被配置为禁止所有 OPTIONS
请求,无论如何。
结果是,浏览器断定预检不成功,因此它就在那里停止,永远不会继续尝试代码中的 POST
请求。
鉴于/image/GD8iG.png中显示的内容很难理解这实际上如何在 Chrome 中按预期工作 - 特别是考虑到没有浏览器发送 credentials预检请求中的任何类型,因此就预检而言,浏览器在处理凭据方面可能存在的任何差异都不会产生任何影响。
关于angularjs - 为什么大多数浏览器上的预检请求中不包含 TLS 客户端证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46783506/
我在 swagger.mydomain.com 上运行了 swagger (docker: swaggerapi/swagger-ui),并为在 a.mydomain.com 和 b.mydomain
在我的应用程序中,进行以下两步调用时,我在第二个 AJAX 调用中收到预检错误: $.ajax({ type:'POST', url:'https://podio.com/oauth/
我们在 Istio 中使用 Kubernetes 并配置了一个虚拟服务: http: - match: - uri: prefix: /api rewrite:
我有一个 Firebase Callable Cloud Function我在浏览器的 javascript 应用程序中调用它。 因为请求主机是 ...cloudfunctions.net 而不是我的
这个问题在这里已经有了答案: XMLHttpRequest cannot load XXX No 'Access-Control-Allow-Origin' header (11 个答案) 关闭 3
我目前对如何“选择”或选择在请求之前执行 Angular 的(jquery)预检 OPTIONS 调用感到困惑。 我有一个正常的 RESTful api 调用 (api.domain.co) 我已在主
我用 C# 创建了一个 WebService。所有 GET 方法都可以正常工作。 现在我需要提供一些 POST 方法。通过 C# 调用它时,它可以正常工作。然后我尝试用 JavaScript 编写一个
我正在尝试向我的 REST API 发出 POST 请求。这是代码片段(使用 AngularJS): $http({ method: 'POST',
我正在使用 rack-cors 中间件从站点向我的 Rails 应用程序发出跨域请求(尽管我不认为这个问题特定于 rack-cors)。当我用 Firebug 检查控制台输出时,我注意到只有一个请求发
我正在使用 rack-cors 中间件从站点向我的 Rails 应用程序发出跨域请求(尽管我不认为这个问题特定于 rack-cors)。当我用 Firebug 检查控制台输出时,我注意到只有一个请求发
您好,我正在尝试在 Debian 8 Jessie 中设置 DC/OS,我使用 ssh key 建立了 ssh 连接,我能够在没有密码的情况下登录到所有主机和代理(他们正在运行 CentOS 7)。奇
我正在制作一个简单的网络应用程序,它与我无法控制的服务器进行通信。 起初我配置了一个自定义的 $resource GET 请求并且工作正常。现在我需要做一个 POST 请求来从同一台服务器请求一些信息
我正在构建一个带有 Spring Boot 后端的 Angular 2 应用程序。几天来,我一直在尝试解决 CORS 预检的问题。根据这个topic ,它应该像这样与 CORS 过滤器一起工作: @C
我需要将 CORS 过滤器添加到我的 Spring Boot Web 应用程序中。 我添加了如下文档中所述的 CORS 映射 http://docs.spring.io/spring/docs/cur
我正在尝试对我部署的用于检索 JSON 数据的 Azure 函数进行 POST。我收到 CORS 错误。 有权从来源“http://localhost:3000”在“{API URL}”获取数据' 已
我有一个 Angular 应用程序和 Node 后端,所有请求都正常工作,但是当我尝试使用 get 请求并且在其中重定向请求时,会发生“CORS 预检 channel 未成功”此错误。 .当我在 po
我正在尝试获取名为 X-Total-Pages 的自定义 header 当我做GET时 Ajax 调用。调用从客户端发送到 API。API 允许使用以下 header : Access-Control
我正在尝试在 OS X 10.11.3 上运行 Plone 统一安装程序(适用于 4.3.9)不 使用 --without-ssl 选项,并且我收到以下错误: Unable to find libss
我的架构中有三个应用程序。 它们在同一台服务器上,但具有不同的端口号。 A - Token Application (port 4444) - Asp.net WebApi B - API Appli
所以我有一个不寻常的问题,我不确定如何进行调试。我有一个 angular 4 应用程序,它在服务器端使用 cakephp。 在我的应用程序中,我可以访问许多不同的屏幕,除了一个并且它只是 Firefo
我是一名优秀的程序员,十分优秀!