加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

rest – ASP.NET Web API身份验证选项

发布时间:2020-12-16 06:23:15 所属栏目:asp.Net 来源:网络整理
导读:有哪些选项可用于对来自其他域的 JQuery应用程序使用的MVC3 Web API应用程序进行身份验证? 以下是我迄今为止尝试的限制/事项: – 我不想使用OAuth;对于用户群有限的私有应用程序我不能指望最终用户在现有提供商上拥有他们的帐户,并且没有可以实现我自己的
有哪些选项可用于对来自其他域的 JQuery应用程序使用的MVC3 Web API应用程序进行身份验证?

以下是我迄今为止尝试的限制/事项: –

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

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

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

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

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

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

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

编辑

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

问题主要在于从客户端向API传输身份验证信息: –
– 它不能依赖服务器/ API状态.所以我不能在一次调用中传递用户名/密码,获取令牌然后继续使用该令牌(打开重放攻击)
– 任何需要使用请求标头的东西都出来了,因为IE像其他浏览器一样使用XDR而不是XHR,并且它不支持自定义标头(我知道IE10支持XHR,但实际上我需要IE8支持)
– 我想我已经卡住了生成一个HMAC并将其传递到某个地方的URL(路径或查询字符串),但这似乎是一个黑客,因为我正在使用不是为此而设计的部分请求
– 如果我使用路径有很多混乱的解析,因为至少我必须传递用户名,时间戳和哈希与每个请求;这些需要以某种方式分隔,我几乎无法控制在其余网址中使用的分隔符
– 如果我使用数据(querystring / formdata)我需要根据我正在使用的方法(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,我现在可以确切地知道如何签署请求并将其发送到您的服务器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读