我希望在web应用程序和web之间共享一个身份验证实现。web应用程序将是ASP.NET (主要是MVC 4),API将主要是ASP.NET WEB,尽管我预计它还会有一些自定义模块或处理程序。
我想:
实现此功能的方法是为web应用程序使用普通的ASP.NET窗体身份验证,并将另一个模块推到堆栈中(与夫人-混合身份验证处理ASP.NET模块非常类似)。这个模块将查找一些HTTP报头(特定于实现),它指示“调用者是API”。
如果设置了标头“调用方是API”,则该服务的响应将与标准ASP.NET窗体身份验证不同,它将:
我的问题(S)是:
发布于 2012-12-12 23:33:42
我不太明白你到底想要分享什么。
我想你不会找到一个框架,因为你想要做的事情并不难解决。
1)第三方应用程序只会触及您的通用API。它只使用API身份验证(通过表单身份验证、api密钥使用、选择)。
2)您自己的应用程序通过用户操作将重定向到登录页面等,并自行选择身份验证(可能是表单身份验证)。这是关于用户可以通过浏览器的地址栏输入的东西。如果您的应用程序碰巧在幕后使用了您的通用API,那么您就不会在ajax调用中将用户重定向到您的登录页面。您的应用程序应该为用户处理/防止这种情况。用户不会通过浏览器的地址栏进行API调用。
因此,为了使应用程序能够使用通用API,通用API只需要支持相同的身份验证方案(表单身份验证)。或者,您的应用程序必须在用户登录后获取用户的api密钥或要使用的东西。
您可以轻松地在MVC中创建一个授权属性,它将检查多个选项,首先检查api密钥,然后检查基于表单身份验证的cookie令牌。如果它没有发现任何东西,您的通用API应该或需要只抛401。
您的应用程序将从ajax调用失败中提取它们,并决定将用户移到登录页面。
发布于 2012-11-24 17:07:55
通常,这个场景(相同的服务器端系统、不同的客户端)被管理,将使用服务器以不同方式提供的相同服务集的响应性委托给客户端(在您的模式中,是服务器根据客户端请求更改其行为)。
在其他方面,你通常有:
在服务器端,由于使用不同的HTTP谓词(GET、POST等),通常使用RESTful GET服务。很容易区分和满足来自不同客户端的请求。
撇开这一点不说,使用自定义身份验证和安全机制/协议通常被认为是一个非常糟糕的主意,因为很容易忽略一些重要的漏洞。如果您的开发工作的主要目标不是身份验证机制,那么您可能应该尝试使用一个现有的系统,比如OAuth、CAS之类的。
当然,如果您的开发工作的主要目标是身份验证机制,则这不适用于您。在第二种情况下,您应该在客户机请求头中放入服务器端生成的内容,用于标识客户端,并且经常更改(即:客户机会话ID,最有可能是哈希),并将所有检查和跳转委托给服务器端程序(该程序在您的控制下,是可信任的)。
将容易复制、容易伪造的字符串放入客户端请求头中,并根据此字符串更改服务器端软件行为,并不是处理身份验证等与安全相关的机制的好方法。
https://softwareengineering.stackexchange.com/questions/176322
复制相似问题