从经过表单身份验证的Web应用程序验证basic-auth REST API调用

时间:2014-01-08 12:22:58

标签: asp.net-mvc authentication cookies asp.net-web-api

我正在开发一个包含两个组件的服务 - 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,而不是表单+基本身份验证?

1 个答案:

答案 0 :(得分:0)

好的,我提出了以下解决方案:

  1. 我已将表单身份验证添加到 REST API ,并确保不在{em> machine.config <的IsolateApps部分中使用<machinekey> / em>的。这可确保 REST API 可以使用相同的ASPXAUTH Cookie。如果没有ASPXAUTH cookie,我确保回到基本身份验证。

  2. 由于Same-origin policy(即使Cookie的域名为“.myservice.com”),因此无法在ajax请求中将ASPXAUTH Cookie包含到其他子域中,我选择的解决方案是将一个应用程序(通过IIS)添加到名为“api”的Web界面。

  3. ajax调用现在指向“/app.myservice.com/api / ...”而不是“https://api.myservice.com/ ...”,并且包含ASPXAUTH cookie作品。

  4. 不确定这是否是最佳解决方案,但它既干净又安全。只有调整才能共享机器密钥。如果在Web场中运行,则需要为所有计算机设置相同的计算机密钥。