的ASP.NET Web API认证选项(ASP.NET Web API Authenticatio

2019-07-20 09:37发布

哪些选项可用于要由来自另一个域jQuery的应用程序所消耗的MVC3的Web API应用的认证?

这里有约束/事到目前为止,我已经试过: -

  • 我不想使用OAuth; 与有限的用户群的专用应用我不能指望最终用户对现有的供应商自己的账户并没有范围,以实现自己的
  • 我有一个全功能的HMAC-SHA256使用FPGA实现在头传递数据就好了工作; 但是,这并不在IE工作,因为在CORS IE8 / 9坏了,不允许你送头
  • 我需要跨域的消费应用程序是在不同的域的API,但不能使用JSONP监守它不允许你使用页眉
  • 我想,以避免令牌(只)为基础的方法,因为这是开放给重播并且通过状态违反REST

在这一点上,我辞职到使用URL或查询字符串/后提供的哈希和其他变量HMAC-SHA256方法。

在URL中把这些变量似乎只是脏了,并把它们在查询字符串/后是一种痛苦。

我成功地使用jQuery $ .ajaxSetup beforeSend选项生成散列并将其连接到头部,但正如我所说,你不能用IE8 / 9使用页眉。

现在我不得不求助于$ .ajaxPrefilter,因为我不能改变beforeSend ajax的数据,而不能只在$ .ajaxSetup扩展的数据,因为我需要基于AJAX的类型来动态计算哈希值查询。 $ .ajaxPrefilter也是一个问题,因为没有添加这样的方式所需的变量没有干净/简单的方法就是方法无关...即它必须查询字符串的GET和FORMDATA为POST

我必须失去了一些东西,因为我无法找到一个解决方案: - 一)支持跨域一)未对MVC和JQuery边c既是一个巨大的黑客)实际上安全d)与IE8 / 9工作

必须一个人在那里做正确此...

编辑

为了澄清,在API方面的认证机制是好的...不管我验证请求哪种方式我产生的GenericPrincipal并使用该API(这样做的优点是另一篇文章中,但它允许我使用在MVC 标准的授权机制,我更喜欢我自己的滚动...少对其他开发人员对我的API来学习和维护)

问题在于primarly鉴权信息从客户端转移到API: - - 它不能依赖于服务器/ API状态。 所以我不能在一个呼叫通过用户名/密码,获得令牌回来,然后继续使用该令牌(开放重播攻击) - 任何需要使用请求头已经出来了,因为IE使用XDR,而不是像XHR其余浏览器的,并且它不支持自定义页眉(我知道IE10支持XHR,但实际上我需要IE8 +支持) - 我觉得我卡生成HMAC,并传递给它的URL的地方(路径或查询字符串),但这似乎是一个黑客,因为我使用的是不适合这个要求的部分 - 如果我使用的路径有很多乱七八糟的解析,因为至少我必须通过一个用户名,时间戳和哈希每个请求; 这些都需要以某种方式分隔和我都在网址中的其余部分用于在分隔符少控制 - 如果我使用数据(查询字符串/ FORMDATA)我需要改变的地方,我要送这取决于我的方法,我的认证细节使用(FORMDATA为POST / PUT /等和查询字符串为GET),并且我也polution与这些VARS应用层数据空间米

由于糟糕,因为它是,查询字符串/ FORMDATA似乎是最好的选择; 但是现在我有工作,如何捕捉到这些在每个请求。 我可以使用的MessageHandler或过滤器,但也提供了convienient的方式来访问FORMDATA。

我知道我可以只写所有的分析和处理自己的东西(它看起来像我这样),但关键是我不相信有没有一个解决方案了。 这就像我有(1)对于IE的支持,(2)安全(3)干净的代码,我只能选两个。

Answer 1:

您的要求似乎有点没有道理给我。 你永远不能在同一时间一切,你必须愿意放弃的东西了。 一对夫妇的言论:

  • OAuth的好像是你想要的这里,至少有一些修改。 您可以使用Azure的访问控制服务,这样你就不必实现自己的令牌提供商。 这样一来,你已经“外包”安全令牌提供者的实现。 上次我检查Azure的ACS还是免费的。 有很多混乱的,当你看ACS文档,因为人们大多用它来插入像Facebook或谷歌其他提供商,但你可以调整它只是为自己的服务令牌提供者。
  • 你似乎非常担心重放攻击。 重放攻击几乎总是一个可能性。 我只听使线材中的数据并将其发送到你的服务器,甚至超过SSL。 重放攻击,你需要处理的东西无关。 通常我做的是跟踪未来请求的高速缓存和哈希签名添加到缓存中。 如果我看到在5分钟内用相同的哈希另一个请求,我忽略它。 对于这项工作,我添加请求的时间戳(毫秒级粒度)和我的哈希参数的URL的某些衍生物。 这允许每毫秒一次操作从同一客户端相同的地址,而无需请求被标记为重放攻击。
  • 你刚才提到的jQuery,如果你正在使用的哈希方法,它让我为难了一下。 这将意味着你确实有你的哈希算法,并在客户端上签名的逻辑。 这是一个严重的缺陷,因为只是检查的JavaScript,我现在可以确切地知道如何签署请求,并将其发送到服务器。


Answer 2:

简单地说; 没有太多特殊的ASP.NET的WebAPI,当涉及到身份验证。

我能说的是,如果你正在主持这里面ASP.NET,您将通过ASP.NET得到认证和授权支持。 如果您选择了自托管,你将不得不启用WCF绑定的安全选项的选项。

当你在托管ASP.NET你的WebAPI,你将有几个身份验证选项:

  1. 基本身份验证
  2. 窗体身份验证 - 例如从任何ASP.Net项目可以以表单验证使Authentication_JSON_AppService.axd
  3. Windows身份验证 - 的HttpClient / WebHttpRequest / Web客户端
  4. 或明确允许您的WebAPI的方法匿名访问


文章来源: ASP.NET Web API Authentication Options