JWT 不记名令牌流
Posted
技术标签:
【中文标题】JWT 不记名令牌流【英文标题】:JWT Bearer Token Flow 【发布时间】:2015-08-13 18:16:02 【问题描述】:我想要的是ASP.NET Core中JWT生成和JWT消费的方法。
没有 OAuth2 流程,我确实有 IdentityServerv3 与 OAuth2 一起使用,但是当我拥有双方时,对于访问 API 的单个应用程序来说,这只是矫枉过正。
我遇到的主要困难是在 ASP.NET Core 中找到 Microsoft.Owin.Security.Jwt 的等价物。此列表中的任何内容https://www.myget.org/gallery/aspnetvnext 似乎都没有相关性。还是该软件包实际上与 ASP.NET Core 保持相关?
【问题讨论】:
gist.github.com/siacomuzzi/1832edeb905a9582a7dd ? 谢谢。我已经遇到过这个问题,同时也在使用它,但它只用于 JWT 消费,而不是生成,并使用在 asp.net5 中似乎已弃用的 Microsoft.Owin 包。它们是可用的,只是它们不使用 Microsoft.AspNet.Authentication 那些似乎一切都在移动的地方。 【参考方案1】:如果您正在寻找一种(简单的)方法来生成您自己的 JWT 令牌,您应该直接使用JwtSecurityTokenHandler
。您可以在您提到的 MyGet 存储库的 System.IdentityModel.Tokens
包中找到它(但现在版本有点旧)或直接在 Azure AD 存储库中的System.IdentityModel.Tokens.Jwt
包中找到它:https://www.myget.org/gallery/azureadwebstacknightly
当然,使用标准协议来颁发和检索您的 JWT 令牌是非常值得推荐的,OAuth2 和 OpenID Connect 可能是最好的选择。
请注意,IdentityServer 不是唯一适用于 ASP.NET 5 的服务器。我个人正在开发 Katana 3 附带的 OAuth2 授权服务器中间件的高级分支,它提供了一个不同的方法:https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server
app.UseOAuthBearerAuthentication(new JwtBearerOptions
AutomaticAuthenticate = true,
AutomaticChallenge = true,
Audience = "http://localhost:54540/",
Authority = "http://localhost:54540/"
);
app.UseOpenIdConnectServer(options =>
options.Provider = new AuthorizationProvider();
);
要了解有关此项目的更多信息,我建议阅读http://kevinchalet.com/2016/07/13/creating-your-own-openid-connect-server-with-asos-introduction/。
如果您需要更多信息,请随时联系我 https://jabbr.net/#/rooms/AspNetCore。
【讨论】:
JwtSecurityTokenHandler
的最后一个参数是SigningCredentials
。但是我该如何创建一个实例呢?【参考方案2】:
我已经开始使用OpenIddict,我认为这正是您所需要的。
这基本上就是我需要的所有配置:
配置服务:
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders()
.AddOpenIddictCore<Application>(config => config.UseEntityFramework());
配置
app.UseOpenIddictCore(builder =>
// tell openiddict you're wanting to use jwt tokens
builder.Options.UseJwtTokens();
// NOTE: for dev consumption only! for live, this is not encouraged!
builder.Options.AllowInsecureHttp = true;
builder.Options.ApplicationCanDisplayErrors = true;
);
// use jwt bearer authentication
app.UseJwtBearerAuthentication(options =>
options.AutomaticAuthenticate = true;
options.AutomaticChallenge = true;
options.RequireHttpsMetadata = false;
options.Audience = "http://localhost:58292/";
options.Authority = "http://localhost:58292/";
);
还有一两件小事,比如你的 DbContext 需要从 OpenIddictContext<ApplicationUser, Application, ApplicationRole, string>
派生。
您可以在我的这篇博文中看到完整的解释(包括指向 github 存储库的链接): http://capesean.co.za/blog/asp-net-5-jwt-tokens/
【讨论】:
以上是关于JWT 不记名令牌流的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 JWT 不记名身份验证在令牌说 5 分钟后将令牌识别为过期?
JWT 不记名令牌:“观众 'api://...' 无效”[关闭]