【问题标题】:Where does Web API store generated tokens in order to validate subsequent requests?Web API 在哪里存储生成的令牌以验证后续请求?
【发布时间】:2017-03-24 17:53:05
【问题描述】:

我有一个 Web API 和 AngularJS 客户端。 API 使用由 Visual Studio 提供的默认授权提供程序在令牌请求中使用 grant_type 'password' 生成令牌。

AngularJS 客户端能够通过使用凭据调用令牌端点从 Web API 获取不记名令牌,然后传递此令牌以在 API 中执行授权请求。

当 AngularJS 在任何授权的 API 调用上发送令牌时,Web API 是如何验证令牌的?令牌存储在哪里?

我在 SQL Server 中检查了身份表,我找不到任何字段来存储此令牌信息。我检查了配置文件,它也没有存储在那里。你能帮我理解这个概念吗?

【问题讨论】:

    标签: asp.net-web-api oauth-2.0


    【解决方案1】:

    拉吉,

    默认情况下,服务器不存储令牌。只有您的客户端拥有它并通过授权标头将其发送到服务器。

    如果您使用 Visual Studio 提供的默认模板,则在 Startup ConfigureAuth 方法中调用以下 IAppBuilder 扩展:app.UseOAuthBearerTokens(OAuthOptions)

    这个来自Microsoft.AspNet.Identity.Owin 包的扩展使您可以轻松地生成和使用令牌,但由于它是一体式的,因此令人困惑。 在幕后它使用了两个 Owin 中间件:

    • OAuthAuthorizationServerMiddleware:授权和传递令牌
    • OAuthBearerAuthenticationMiddleware:发生在PipelineStage.Authenticate,读取授权头,检查token是否有效并对用户进行身份验证。

    为回答您的问题,WebAPI 能够通过OAuthBearerAuthenticationMiddleware 验证令牌,它将确保通过授权标头发送的令牌有效且未过期。并且令牌仅由您的客户端存储,如果客户端丢失它,它将不得不请求一个新的。

    我建议您深入了解 OAuth 协议,不要使用扩展名 UseOAuthBearerTokens,而是查看 UseOAuthAuthorizationServerUseOAuthBearerAuthentication,它将帮助您更好地了解它的工作原理。

    【讨论】:

    • 感谢您的指点。我正在尝试查找有关 OAuth2 的更多信息。您说“OAuthBearerAuthenticationMiddleware 确保通过授权标头发送的令牌有效且未过期”。知道是什么样的验证吗?它是否试图用密钥对令牌进行签名以验证它?我是否能够在其他 webAPI 中使用此验证,以便我可以使用相同的不记名令牌,而不必在每个 web api 中实现身份验证/授权部分?
    • 你的token在生成的时候,里面包含了一个过期时间,它携带了它的过期时间。当中间件取消保护令牌中包含的信息时,它将生成一个AuthenticationTicket 并检查过期时间。默认情况下,如果您不指定“AccessTokenFormat”,它将使用 DPAPI(数据保护 API),它是内置在操作系统中的,用于保护令牌。如果您想在多个 Web API 上使用相同的令牌进行授权,那么如果您在服务器上,它将起作用。如果不是这样,那就需要一些工作了,我建议你看看JWT。
    • @Raj 我回答你的问题了吗?
    • 道歉。是的,几乎回答了我的问题。谢谢。
    【解决方案2】:

    生成的令牌很可能是 JWT (Get Started with JSON Web Tokens),这意味着它是使用只有服务器或其他受信任方知道的密钥/密钥签名的自包含令牌。

    JSON Web Token (JWT) 是一个开放标准 (RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以 JSON 对象的形式安全地传输信息。 此信息经过数字签名可以验证和信任。

    (重点是我的)

    这意味着服务器在收到令牌时可以确保

    • 令牌最初是由受信任方通过检查签名是否有效而颁发的。
    • 令牌与有权执行以下请求的用户相关联,因为令牌本身包含唯一标识该用户的信息。

    这种方法的附带好处是服务器不需要跟踪或存储生成的令牌以便以后验证它们。由于没有其他人拥有密钥/密钥,因此您无法在不使签名组件无效的情况下修改令牌,这意味着伪造的令牌最终会被服务器拒绝。

    这是对所发生情况的简化描述,还有更多关于如何正确发布和验证令牌的详细信息。您应该阅读OAuth2OpenID Connect 规范以了解有关基于令牌的身份验证主题的更多信息。


    另外请注意,我假设了 JWT 令牌,因为它是目前最广泛采用的格式来完成这些场景,它也是与 OAuth2 和 OpenID Connect 结合使用的令牌格式。但是,使用其他令牌格式仍然可以实现相同的效果。

    【讨论】:

      猜你喜欢
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 2019-05-06
      • 2012-08-31
      • 1970-01-01
      • 2015-07-02
      相关资源
      最近更新 更多