Web API存储在哪里生成令牌以验证后续请求?

时间:2016-11-10 16:08:39

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

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

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

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

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

2 个答案:

答案 0 :(得分:6)

拉​​吉,

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

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

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

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

为了回答您的问题,WebAPI能够通过OAuthBearerAuthenticationMiddleware验证令牌,它将确保通过授权标头发送的令牌有效且未过期。并且令牌仅由您的客户端存储,如果客户端松开它,则必须请求新的令牌。

我建议您深入了解OAuth协议,而不是使用扩展程序UseOAuthBearerTokens,请查看UseOAuthAuthorizationServerUseOAuthBearerAuthentication,它将帮助您更好地了解如何它有效。

答案 1 :(得分:2)

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

  

JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各方之间作为JSON对象安全地传输信息。 此信息可以通过数字签名进行验证和信任。

(重点是我的)

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

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

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

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

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