ASP.NET Web API身份validation选项

有哪些选项可用于对来自其他域的JQuery应用程序使用的MVC3 Web API应用程序进行身份validation?

这是迄今为止我尝试过的约束/事情: –

  • 我不想使用OAuth; 对于用户群有限的私有应用程序,我不能指望最终用户在现有提供商上拥有自己的帐户,并且无法实现自己的帐户
  • 我有一个function齐全的HMAC-SHA256实现,可以正常使用标头中传递的数据; 但这在IE中不起作用,因为IE8 / 9中的CORS已损坏,并且不允许您发送标头
  • 我需要跨域,因为消费应用程序在API的不同域上,但不能使用jsonp,因为它不允许您使用标头
  • 我想避免使用基于令牌(仅)的方法,因为这可以重播并通过状态来违反REST

此时我已经退回到HMAC-SHA256方法,该方法使用URL或查询字符串/ post来提供哈希和其他变量。

将这些变量放在URL中似乎很脏,将它们放在查询字符串/post中是一件痛苦的事。

我成功地使用了JQuery $ .ajaxSetup beforeSend选项来生成哈希并将其附加到标题,但正如我所提到的,你不能使用IE8 / 9的标题。

现在我不得不求助$ .ajaxPrefilter,因为我无法更改beforeSend中的ajax数据,并且不能只扩展$ .ajaxSetup中的数据,因为我需要根据ajax的类型动态计算散列值查询。 $ .ajaxPrefilter也是一个问题,因为没有干净/简单的方法以方法无关的方式添加所需的变量…即它必须是GET的查询字符串和POST的formdata

我必须遗漏一些东西,因为我找不到一个解决方案: – a)支持跨域a)不是MVC和JQuery方面的大规模黑客攻击c)实际上安全d)适用于IE8 / 9

必须有人在那里正确地做这件事……

编辑

为了澄清,API方面的身份validation机制很好……无论我validation请求的哪种方式,我生成一个GenericPrincipal并在API中使用它(这个的优点是另一个post,但它确实允许我使用MVC中的标准授权机制,我更倾向于自己编写…而不是我的API上的其他开发人员学习和维护

问题主要在于将身份validation信息从客户端传输到API: – – 它不能依赖于服务器/ API状态。 所以我不能在一次调用中传递用户名/密码,获得一个令牌然后继续使用该令牌(打开重放攻击) – 任何需要使用请求头的东西都没有,因为IE使用XDR而不是XHR浏览器,它不支持自定义标头(我知道IE10支持XHR,但实际上我需要IE8 +支持) – 我想我已经卡住生成一个HMAC并将其传递到URL某处(路径或查询字符串)但这个看起来像是一个黑客,因为我正在使用不是为此设计的请求的部分 – 如果我使用路径有很多杂乱的解析,因为至少我必须传递用户名,时间戳和哈希与每个请求; 这些需要以某种方式分隔,我几乎无法控制在其余url中使用的分隔符 – 如果我使用数据(querystring / formdata)我需要更改我发送validation详细信息的位置,具体取决于我的方法使用(用于POST / PUT / etc的formdata和用于GET的查询字符串),我还使用这些变量对应用程序层数据空间进行了解析

尽管很糟糕,查询字符串/ formdata似乎是最好的选择; 但是现在我必须弄清楚如何在每个请求上捕获这些。 我可以使用MessageHandler或Filter,但都不提供访问formdata的方便方法。

我知道我可以自己编写所有解析和处理内容(看起来我会这样)但重点是我无法相信已经没有解决方案了。 这就像我有(1)支持IE,(2)安全和(3)干净的代码,我只能选择两个。

你的要求对我来说似乎有点不合理。 你不可能同时拥有所有东西,你必须愿意放弃一些东西。 几句话:

  • OAuth似乎就是你想要的,至少有一些修改。 您可以使用Azure的访问控制服务,这样您就不必实现自己的令牌提供程序。 这样,您就“外包”了安全令牌提供程序的实现。 最后我检查了Azure ACS仍然是免费的。 当您查找ACS文档时会有很多混乱,因为人们大多使用它来插入Facebook或Google等其他提供商,但您可以将其调整为您自己服务的令牌提供商。
  • 你似乎很担心重播攻击。 重播攻击几乎总是有可能的。 我必须只听通过数据的数据并将其发送到您的服务器,甚至通过SSL。 重播攻击是你需要处理的事情。 通常我所做的是跟踪即将到来的请求的缓存并将哈希签名添加到我的缓存中。 如果我在5分钟内看到另一个具有相同哈希的请求,我会忽略它。 为此,我将请求的时间戳(毫秒粒度)和URL的一些衍生物添加为我的哈希参数。 这允许每毫秒一次操作来自同一客户端的相同地址,而不将请求标记为重放攻击。
  • 你提到jQuery如果使用散列方法会让我感到困惑。 这意味着你实际上在客户端上有你的哈希算法和你的签名逻辑。 这是一个严重的缺陷,因为通过检查javascript,我现在可以确切地知道如何签署请求并将其发送到您的服务器。

简单地说; 在身份validation方面,ASP.NET WebAPI没有太多特别之处。

我可以说的是,如果你在ASP.NET中托管它,你将获得ASP.NET的支持,用于身份validation和授权。 如果您选择自托管,则可以选择启用WCF绑定安全性选项。

在ASP.NET中托管WebAPI时,您将拥有多个身份validation选项:

  1. 基本认证
  2. 表单身份validation – 例如,从任何ASP.Net项目,您可以启用Authentication_JSON_AppService.axd以进行表单身份validation
  3. Windows身份validation – HttpClient / WebHttpRequest / WebClient
  4. 或者明确允许匿名访问WebAPI的方法