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&lt;ApplicationUser, Application, ApplicationRole, string&gt; 派生。

您可以在我的这篇博文中看到完整的解释(包括指向 github 存储库的链接): http://capesean.co.za/blog/asp-net-5-jwt-tokens/

【讨论】:

以上是关于JWT 不记名令牌流的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 JWT 不记名身份验证在令牌说 5 分钟后将令牌识别为过期?

JWT 不记名令牌:“观众 'api://...' 无效”[关闭]

JWT中令牌之前的不记名

jwt 不记名令牌是不是应该在服务器端的某个地方持续存在

添加基于策略的授权会跳过 JWT 不记名令牌身份验证检查吗?

JWT不记名令牌授权不起作用asp net core web api