Web API 安全和身份验证 - 不记名令牌

Posted

技术标签:

【中文标题】Web API 安全和身份验证 - 不记名令牌【英文标题】:Web API Security and Authentication - bearer token 【发布时间】:2014-10-13 03:57:25 【问题描述】:

我正在努力学习 Web API 和 API 的一般方法。

目前,我正在调查身份验证。

我知道 API 身份验证和授权有多种方式。最常见的似乎是不记名令牌。

我还看到了 SAML,并且我也了解 x509(从我的 WCF 时代开始)。

今天我想谈谈不记名令牌。不记名令牌作为标头传递。标头未加密可能未加密?因此,有人可能会在未经同意的情况下获取所述令牌并冒充用户。这是我对不记名令牌的看法。似乎当今许多流行的服务都使用这种 API 身份验证方法。

除了不记名令牌之外还有哪些其他选项,但或多或​​少与 HMAC 处理消息等一样安全?

我似乎对很多身份验证方法都略知一二。我正在尝试了解更多,并希望构建一个非常安全的 API,允许 SSO(单点登录) - 如果不记名令牌是要走的路,那么很好,这是非常简单且开箱即用的解决方案。如果有更好、更安全的东西,我愿意接受,即使工作和时间远远超过不记名令牌。

我不知道为什么我不喜欢不记名令牌的声音,但它似乎很容易被攻击和利用。特别是对于支付相关类型的服务。

谢谢!

【问题讨论】:

这不是一个完整的答案,但我玩弄了 WebAPI 和令牌。不记名令牌不仅仅是一些随机的字节序列。它们包含加密信息。就我而言,我尝试在令牌中加密客户端的 IP 地址,这样即使有人劫持它,除非客户端的 IP 地址与令牌包含的内容匹配,否则它也无法工作。我知道这不是一个完整的解决方案,但它确实有效。 您是如何控制 STS 服务器分发令牌的令牌的? 标头已加密。看到这个答案***.com/questions/187655/are-https-headers-encrypted 我没有确切的代码,但我知道 WebAPI SDK 允许您覆盖令牌生成和验证的默认实现。 这是一篇关于拒绝现有令牌的文章。在OAuthBearerAuthenticationProvider 中也可能有一个创建事件的事件。 pressinganswer.com/81522/… 【参考方案1】:

不记名令牌作为标头传递。标头未加密,因此,有人可能会在未经同意的情况下获取所述令牌并冒充用户。

虽然这可能并不总是理想的解决方案,但您可以确保仅使用 https 传递数据。根据Eran Hammer(实际上在本文中建议不要使用不记名令牌),如果使用 HTTPS 传递标头信息将保持安全。此外,当您需要再次使用令牌或敏感数据时,您可以添加自己的加密算法。 见#8 in 10 Things You Should Know About Tokens

【讨论】:

我确实看到/发现标头是加密的 - 这是一个奖励。我仍然想看看还有哪些其他选项,例如涉及 MAC 化消息的选项? 这真的应该是一个评论开始,我很抱歉。我对其他方法不太熟悉,但我可以说我对不记名令牌提供的安全性非常满意。我通过 HTTPS 将它与 MVC Web API 一起使用。【参考方案2】:

标头使用 HTTPS 加密 - 承载令牌非常适合安全,我现在在我的企业应用程序中使用它。

【讨论】:

以上是关于Web API 安全和身份验证 - 不记名令牌的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core API 使用 JWT 不记名令牌进行身份验证

实施 Identity 2.1 + OWIN OAuth JWT 不记名令牌时如何从 Web API 控制器端点进行身份验证

Azure AD 与 Web API 的不记名令牌身份验证无法正常工作并抛出错误,因为“此请求的授权已被拒绝”。

为多个 API 调用重用不记名令牌

DotNet Core Api - 特定端点的不同身份验证

从 Web API 的不记名令牌返回用户角色