身份服务器如何在 API 或我们使用 Authorize 属性时验证令牌?
Posted
技术标签:
【中文标题】身份服务器如何在 API 或我们使用 Authorize 属性时验证令牌?【英文标题】:How do identity server validate the token at API or when we use Authorize attribute? 【发布时间】:2017-07-28 20:59:23 【问题描述】:我使用身份服务器 4 作为身份提供者。
获取成功登录的令牌后,我们将这个令牌传递给资源服务器。
我的问题是资源服务器端的身份服务器提供者如何验证提交的令牌?
当我使用 fiddler 观察流量时,我没有看到任何将令牌提交给提供商进行检查的请求。
这意味着资源服务器端的身份服务器提供者本身正在验证令牌?
那么为什么我们需要在不检查时提供授权呢?
资源端的身份服务器提供者如何确保它是由有效的令牌提供者颁发的?
【问题讨论】:
【参考方案1】:资源服务器不会通过线路将令牌发送到身份提供者以验证令牌。这会给您的资源服务器带来相当大的开销。
相反,资源服务器会下拉(并可能缓存)位于identityserverUrl./well-known/openid-configuration
的身份提供者发现文档。本文档包含允许资源服务器在其自己的上下文中验证令牌的材料。这当然是假设令牌是 access_token (issuer
,jwks_uri
)
如果您的资源服务器正在使用 JwtBearerAuthentication 中间件或 IdentityServer4.AccessTokenValidation 中间件之类的东西,这些东西将为您完成。
【讨论】:
【参考方案2】:JWT tokens
是独立的,不需要往返来验证它们在每次使用时仍然有效......只要它们没有过期,它们就有效,如果它们没有'未被篡改,仅涉及签名检查。
您可以将您的客户端设置为请求reference tokens
(并设置您的 API 以接受它们),这些令牌将在每次使用时都涉及一次往返。然后,您可以撤销令牌,而 JWT 无法做到这一点。
【讨论】:
那么签名检查是如何进行的呢?我们是否需要在资源服务器上维护一些密钥来验证文本是否符合签名? Identity Server 发现端点是我正在寻找的,因为它包含有关公共 RSA 密钥的信息。 永远不应该假设令牌没有被篡改 @SeanHaddy 是的,永远不应该假设它没有被篡改 - 这就是为什么我在回答中提到这需要检查以上是关于身份服务器如何在 API 或我们使用 Authorize 属性时验证令牌?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用无服务器部署没有身份源的 API Gateway 自定义授权方?
如何将 Web api Windows 身份验证与 Angular 应用程序一起使用 [重复]