c# – REST API令牌认证

前端之家收集整理的这篇文章主要介绍了c# – REST API令牌认证前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_0@
我刚开始在.NET中开发我的第一个REST API.由于它将是无状态的,我将使用令牌进行身份验证:

基本思想(System.Security.Cryptography):

> AES用于加密HMACSHA256的完整性
>令牌数据将包含具有属性的对象:username,发出日期和超时
>数据库将保存用户名,散列密码和HMAC哈希

登录

>检查凭据是否有效(用户名,比较哈希密码为db值)
>如果为true,则加密数据对象
>在生成的令牌上使用HMAC并将其存储到数据库
>返回令牌(不含HMAC)给用户(cookie / string)

请求认证方法

>用户发送每个请求的令牌
令牌被解密
>如果过期,错误
>如果没有过期,使用HMAC并将用户名生成的哈希与数据库值进行比较
>如果db检查有效,则用户进行身份验证

我看到的方式,这种方法有以下优点:

>即使db被压缩,它也不包含实际的令牌(哈希不可逆转)
>即使攻击者有令牌,他也不能通过更新字段来增加过期,因为过期日期在令牌本身

现在首先,我不知道这是否是好的方法.

除此之外,我还没有弄清楚,在服务器上存储AES和SHA256密钥的位置(我应该只是硬编码吗?如果我把它们放在web.config或者使用机器键比我在负载平衡的服务器的情况下有问题,…).

最后我在哪里存储AES IV向量,因为Crypto.CreateEncryptor需要它进行解密?这是否意味着用户必须向每个请求发送令牌IV?

我希望这有任何意义,我提前感谢你的答复.

更新:

好的,现在我做了更多的研究,并提出了这个解决方案:

>令牌将包含最初指定的数据(用户名,发布日期和超时)
>令牌使用encrypt-then-mac生成(它包括AES加密数据,这两个值的IV矢量标签用于认证,使用HMACSHA265生成)
> token标签将写入db
>用户将被认证如果:

>标签有效(令牌认证)
>数据可以解密
>令牌尚未过期
>标签数据库中写入的一致
>用户不会在数据库中被阻止(根据需要进行令牌无效)

>键将存储在web.config分开的部分.相同的键将必须在每个服务器上(当然应用程序)

我没有使用FormsAuthenticationTicket,因为在.NET中有以下问题:

>相同的键用于不同的目的(用于查看状态,资源和形式标签的machinekey)
> mac-then-encrypt,.NET使用不被认为是as safe as encrypt-then-mac
>没有内置到invalidate token before it is expired

解决方法

这是从问题的评论线程的跟进.

对于什么,完全是OAuth,你似乎有点困惑,所以希望我可以在这里澄清.

OAuth不是一个Web服务或者你消费的东西.这是一种协议,它描述了一个站点可以如何对服务进行身份验证的方式,而不允许站点知道用户的凭据是什么.大多数OAuth提供商也有一个优点:一个Web服务可以查询用户的信息,同时可以授予许可.

通常,您有兴趣从站点的角度实施OAuth(例如,AcmeWidgets.com),以便用户可以通过Facebook或Google登录.但是,您也可以实施服务端(例如,Facebook通常会在其中),并允许其他人对您进行身份验证.

所以,例如,假设您有一个Web服务,允许第三方网站为用户提供Acme品牌小部件.您的第一个第三方实施者是受欢迎的MyBook.org.流程将如下所示:

>有人邀请用户在MyBook个人资料上使用“Acme Widgets”应用程序.
>用户点击按钮,重定向到AcmeWidgets.com.网址看起来像:

http://acmewidgets.com/oauth/user?r=http://mybook.org/oauth/client\u0026amp;appid=12345
>询问用户是否要允许MyBook访问其数据和配置小部件.
>用户单击是,Acme Widgets注意到用户已经允许了.
>用户将被重定向回MyBook,网址如下所示:

http://mybook.org/oauth/client?token=ABCDEFG
> MyBook,在服务器端,现在采取该令牌,并将一个Web服务调用回到AcmeWidgets:

http://acmewidgets.com/oauth/validate?token=ABCDEFG\u0026amp;appid=12345\u0026amp;appsecret=67890
> AcmeWidgets用标识用户的最终认证令牌进行回复.
>或者,它失败,这意味着用户试图伪造令牌,或者他们拒绝许可或其他一些失败的条件.
> MyBook,带有令牌,现在可以调用AcmeWidgets API:

http://acmewidgets.com/api/provision?appid=12345\u0026amp;token=ABC123\u0026amp;type=etc

这就是所谓的OAuth舞蹈.请注意,这里有一些实现定义的东西,如URL,编码各种令牌的方式,令牌是否到期或被撤销等.

希望为您清除一切!

猜你在找的C#相关文章