使用 Microsoft System.IdentityModel.Tokens.Jwt 在 Asp.net WebApi 中实现 JWT 身份验证

Posted

技术标签:

【中文标题】使用 Microsoft System.IdentityModel.Tokens.Jwt 在 Asp.net WebApi 中实现 JWT 身份验证【英文标题】:Implementing JWT authentication in Asp.net WebApi using Microsoft System.IdentityModel.Tokens.Jwt 【发布时间】:2016-12-28 23:43:03 【问题描述】:

我的问题正是“如何在 WebApi 端管理令牌验证信息?

A) 每个用户是否有唯一的密钥?

B) 如果是,这些存储在哪里?

C) 有人说每次会话都会生成新的密钥:O ??

我会具体说明我认为如何完成或可以完成。

1) App将用户名和密码发送给登录Api(WebApi的一部分)。

2) Api 验证来自数据库的凭据并创建 JWT。

3) 创建一个标准头,比如 header = 'type':'JWT', 'alg':'HMAC'。

4) 然后创建声明/有效负载部分,并将该用户的唯一标识符嵌入其中。

5) 然后 (header.claims) 是 Base64URLEncoded 并输入一个方法,该方法将此编码的信息和密钥作为参数并使用 HMAC 算法对其进行签名。

6) 现在标题、声明、签名(在上一步中获得)与句点连接起来,我们得到一个 JWT。

7) 这个 JWT 被发送回 App。

8) 在下一次请求期间,应用在尝试访问资源时将此 JWT 发送回 WebApi。

9) WebApi 检查 JWT 并解码回标头,从中声明。

10) WebApi 从声明中获取唯一用户标识符并检查该用户是否存在于数据库中。

11) 如果找到用户,它将获取与该用户相关联的密钥,该密钥也存储在数据库中针对该用户。 (可能只是注册时生成的 GUID)

12) 检查令牌是否过期。此信息在索赔/有效负载中以“exp”日期时间或其他形式提供。

13) 假设令牌尚未过期,WebApi 会获取标头和声明/有效负载,并再次使用密钥生成 JWT。

14) 这样创建的 JWT 与 App 发送的 JWT 匹配。如果两者都匹配(签名),则令牌是正确且未经调和的,并且确实由 WebApi 颁发给该用户。

15) WebApi 设置声明标识并允许访问资源。

现在不是每次都在数据库中查找用户标识符,WebApi 还可以在用户登录时维护一个静态用户数组,同时保留他们的密钥。所以它可以从这个数组中获取信息。当用户注销时,用户也会从静态数组中删除。(数组管理不是我现在想要进入的)

这只是我实现它的想法。

我想知道我与其他方式有多少偏差?我不想创建单独的授权服务器。我希望 WebApi 以一种简单但当然安全的方式自行管理它。我将使用 Microsoft JwtSecurityTokenHandler for .Net 4.5 来创建、验证 JWT。

【问题讨论】:

【参考方案1】:

您的问题在本主题中非常笼统,需要很多页的答案。请关注:JSON Web Token in ASP.NET Web API 2 using Owin 它会回答你的许多问题

【讨论】:

以上是关于使用 Microsoft System.IdentityModel.Tokens.Jwt 在 Asp.net WebApi 中实现 JWT 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 Microsoft.Toolkit.Mvvm 和 Microsoft.Xaml.Behaviors.Wpf 将事件参数传递给命令

使用 Microsoft Office 2016 为 Microsoft Office 2013 开发

FILTER:progid:DXImageTransform.Microsoft.Gradient使用

Microsoft.WindowsAzure.Storage 与 Microsoft.WindowsAzure.StorageClient

Microsoft Azure系列之三 Microsoft Azure门户管理

如何在 ASP.Net MVC4 Web API 项目中使用 Microsoft OCR 库 ( Microsoft.Windows.Ocr )?