【发布时间】:2017-05-31 15:35:18
【问题描述】:
我有一个 ASP.NET Web Api,它使用 ASP.NET Identity 来管理用户和角色对 API 的访问。我有一个案例,我试图创建一个 JWT 令牌,以便外部公司可以访问我的一个端点。我一直在尝试使用this SO article - Second answer 中显示的代码创建自己的 JWT。我的 JWT 令牌正在正确解码,但即使我分配了适当的角色,也不允许访问我的端点。我想知道有效负载中是否需要其他信息,因为该系统基于 ASP.NET Identity。
这是我的 JWT 中包含的有效负载
{
iss: "http://mycompany.com",
name: "Company Test",
role: "CompanyTest",
aud: "<Audience ID of my application>",
exp: 1485433642
}
以下是一些在我创建的 JWT 中我遗漏了的有效负载,它们包含在 ASP.NET Identity 生成的 JWT 令牌中。我想知道它们是否必不可少,因此必须包含在 JWT 的有效负载中。
{
"nameid": "<user unique identifier here from Identity table>",
"unique_name": "<Email account of user>",
"http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider": "ASP.NET Identity",
"AspNet.Identity.SecurityStamp": "<Security stamp column from Identity table>"
}
我在尝试创建自己的 JWT 令牌时忽略了这些值,因为我没有将访问权限绑定到特定帐户。我只是想创建一个持久的令牌,外部公司无需登录即可使用。
【问题讨论】:
-
虽然您可能正在解码 JWT,但您仍然需要将身份应用于请求的上下文。这就是图书馆为您做的事情。解码令牌提取所需的信息后,创建身份并应用声明并将原则分配给当前线程。您可以在动作过滤器中抽象出所有这些功能
-
我试图避免的整件事是强迫外部公司通过用户名和密码进行验证,这是我的 API 访问的正常流程。我想我可以使用凭据创建公司登录并对其进行说明,并更改发出的 JWT 的到期时间,然后使用我的密钥退出。
-
他们如何获得令牌
-
我正计划通过安全电子邮件向他们发送令牌。他们会接受它并将其放在他们对我的端点的 API 调用的标头中。
-
滚动您自己的安全性的问题在于,它有很多可能出错的方式。该令牌的寿命是多少?鉴于您必须创建它,然后通过电子邮件将其发送给他们,然后他们必须在令牌过期之前使用它。
标签: asp.net-web-api2 jwt asp.net-identity-2