我正在开发一个包含两个组件的服务 - Web界面和 REST API 。我分别使用ASP.NET MVC和ASP.NET Web API。这两个组件托管在同一域的不同子域。
我希望外部用户和网络界面使用 REST API ,我希望尽可能简化身份验证。
REST API 目前仅支持基本身份验证。
网络界面使用表单身份验证,从而生成ASPXAUTH cookie。 网络界面使用AJAX调用与 REST API 进行交互。
我向社区提出的问题是:
如何验证从网络界面到的AJAX调用 REST API ,使用最优雅,最安全的方法?
一些想法:
在ajax调用中发送ASPXAUTH cookie(通过将cookie域更改为“.myservice.com”以允许跨子域读取)并在API中添加一个读取ASPXAUTH的身份验证方法。不确定这是一个好主意,还是如何实现这一点。
将用户名和API密钥存储在单独的Cookie中。除非值已加密/散列,否则不太安全。
在网络界面中使用OAuth并停用api,而不是表单+基本身份验证?
答案 0 :(得分:0)
好的,我提出了以下解决方案:
我已将表单身份验证添加到 REST API ,并确保不在{em> machine.config <的IsolateApps
部分中使用<machinekey>
/ em>的。这可确保 REST API 可以使用相同的ASPXAUTH
Cookie。如果没有ASPXAUTH
cookie,我确保回到基本身份验证。
由于Same-origin policy(即使Cookie的域名为“.myservice.com”),因此无法在ajax请求中将ASPXAUTH
Cookie包含到其他子域中,我选择的解决方案是将一个应用程序(通过IIS)添加到名为“api”的Web界面。
ajax调用现在指向“/app.myservice.com/api / ...”而不是“https://api.myservice.com/ ...”,并且包含ASPXAUTH
cookie作品。
不确定这是否是最佳解决方案,但它既干净又安全。只有调整才能共享机器密钥。如果在Web场中运行,则需要为所有计算机设置相同的计算机密钥。