首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在API和web应用程序之间共享身份验证方法

在API和web应用程序之间共享身份验证方法
EN

Software Engineering用户
提问于 2012-11-19 00:32:08
回答 2查看 3.4K关注 0票数 3

我希望在web应用程序和web之间共享一个身份验证实现。web应用程序将是ASP.NET (主要是MVC 4),API将主要是ASP.NET WEB,尽管我预计它还会有一些自定义模块或处理程序。

我想:

  1. 在应用程序和API之间共享尽可能多的身份验证实现。
  2. web应用程序的行为类似于窗体身份验证(吸引人的登录页、注销选项、在请求需要身份验证/授权时重定向到/从登录页面)。
  3. 让API调用者使用更接近标准HTTP的东西(401 -未经授权,而不是302 -重定向)。
  4. 提供不需要更改密码的客户端和服务器端注销机制(因此HTTP退出,因为客户端通常缓存他们的凭据)。

实现此功能的方法是为web应用程序使用普通的ASP.NET窗体身份验证,并将另一个模块推到堆栈中(与夫人-混合身份验证处理ASP.NET模块非常类似)。这个模块将查找一些HTTP报头(特定于实现),它指示“调用者是API”。

如果设置了标头“调用方是API”,则该服务的响应将与标准ASP.NET窗体身份验证不同,它将:

  1. 401而不是302在缺乏认证的请求中。
  2. 查找用户名+传入自定义的"Login“header,并在自定义"FormsAuth”标头中返回FormsAuth票证。
  3. 在自定义的“FormsAuthentication”标题中查找FormsAuth票证。

我的问题(S)是:

  1. 是否有一个已经涵盖此场景的ASP.NET框架?
  2. 这项建议的实施是否有明显的漏洞?我主要担心的是一个我看不到的安全风险,但我同样担心这样的实现可能会使它的工作过于局限或笨拙。
EN

回答 2

Software Engineering用户

发布于 2012-12-12 23:33:42

我不太明白你到底想要分享什么。

我想你不会找到一个框架,因为你想要做的事情并不难解决。

1)第三方应用程序只会触及您的通用API。它只使用API身份验证(通过表单身份验证、api密钥使用、选择)。

2)您自己的应用程序通过用户操作将重定向到登录页面等,并自行选择身份验证(可能是表单身份验证)。这是关于用户可以通过浏览器的地址栏输入的东西。如果您的应用程序碰巧在幕后使用了您的通用API,那么您就不会在ajax调用中将用户重定向到您的登录页面。您的应用程序应该为用户处理/防止这种情况。用户不会通过浏览器的地址栏进行API调用。

因此,为了使应用程序能够使用通用API,通用API只需要支持相同的身份验证方案(表单身份验证)。或者,您的应用程序必须在用户登录后获取用户的api密钥或要使用的东西。

您可以轻松地在MVC中创建一个授权属性,它将检查多个选项,首先检查api密钥,然后检查基于表单身份验证的cookie令牌。如果它没有发现任何东西,您的通用API应该或需要只抛401。

您的应用程序将从ajax调用失败中提取它们,并决定将用户移到登录页面。

票数 1
EN

Software Engineering用户

发布于 2012-11-24 17:07:55

通常,这个场景(相同的服务器端系统、不同的客户端)被管理,将使用服务器以不同方式提供的相同服务集的响应性委托给客户端(在您的模式中,是服务器根据客户端请求更改其行为)。

在其他方面,你通常有:

  1. 一个单独的API-公开web服务器程序(通常是一个webservice,通常是一个RESTful webservice),它处理所有请求。
  2. web客户端请求它所需的数据,创建自己的UI并以其特定的方式处理与用户和服务器的所有交互。当然,UI是使用Javascript、HTML和CSS (AJAX)生成和管理的。
  3. 一个API (无UI)客户端,它要求它需要的数据并以其特定的方式处理它们。

在服务器端,由于使用不同的HTTP谓词(GET、POST等),通常使用RESTful GET服务。很容易区分和满足来自不同客户端的请求。

撇开这一点不说,使用自定义身份验证和安全机制/协议通常被认为是一个非常糟糕的主意,因为很容易忽略一些重要的漏洞。如果您的开发工作的主要目标不是身份验证机制,那么您可能应该尝试使用一个现有的系统,比如OAuth、CAS之类的。

当然,如果您的开发工作的主要目标是身份验证机制,则这不适用于您。在第二种情况下,您应该在客户机请求头中放入服务器端生成的内容,用于标识客户端,并且经常更改(即:客户机会话ID,最有可能是哈希),并将所有检查和跳转委托给服务器端程序(该程序在您的控制下,是可信任的)。

将容易复制、容易伪造的字符串放入客户端请求头中,并根据此字符串更改服务器端软件行为,并不是处理身份验证等与安全相关的机制的好方法。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/176322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档