如何使用IdentityServer4创建JWT令牌

时间:2018-07-27 08:41:59

标签: identityserver4

在我的使用IdentityServer4的应用程序(.Net核心应用程序)中,当前创建用于身份验证的“参考”令牌。但是我需要将令牌类型从“引用”类型更改为“ JWT”令牌。我找到了几篇关于此的文章,并按了上述说明进行了尝试,但仍然无法获得“ JWT”令牌,而仅获得了“参考”令牌。

我遵循了以下站点中提到的详细信息,但没有运气。

IdentityServer4 requesting a JWT / Access Bearer Token using the password grant in asp.net core

https://codebrains.io/how-to-add-jwt-authentication-to-asp-net-core-api-with-identityserver-4-part-1/

https://andrewlock.net/a-look-behind-the-jwt-bearer-authentication-middleware-in-asp-net-core/

谁能让我知道如何将令牌类型从“参考”更改为“ JWT”令牌?是否需要创建任何自定义代码/类来实现此目的?

下面是我的Client类中使用的代码。

new Client
            {
                ClientId = "Client1",
                ClientName = "Client1",
                AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, 
                AllowedScopes = new List<string>
                {
                    IdentityScope.OpenId,
                    IdentityScope.Profile,
                    ResourceScope.Customer,
                    ResourceScope.Info,
                    ResourceScope.Product,
                    ResourceScope.Security,
                    ResourceScope.Sales,
                    ResourceScope.Media,
                    ResourceScope.Nfc,
                    "api1"
                },
                AllowOfflineAccess = true,
                AlwaysSendClientClaims = true,
                UpdateAccessTokenClaimsOnRefresh = true,
                AlwaysIncludeUserClaimsInIdToken = true,
                AllowAccessTokensViaBrowser = true,
                // Use reference token so mobile user (resource owner) can revoke token when log out. 
                // Jwt token is self contained and cannot be revoked
                AccessTokenType = AccessTokenType.Jwt,
                AccessTokenLifetime = CommonSettings.AccessTokenLifetime,
                RefreshTokenUsage = TokenUsage.OneTimeOnly,
                RefreshTokenExpiration = TokenExpiration.Sliding,
                AbsoluteRefreshTokenLifetime = CommonSettings.AbsoluteRefreshTokenLifetime,
                SlidingRefreshTokenLifetime = CommonSettings.SlidingRefreshTokenLifetime,
                IncludeJwtId = true,
                Enabled = true
            },

在我的startup.cs中,我有以下代码。

 public void ConfigureServices(IServiceCollection services)
        {
            var connStr = ConfigurationManager.ConnectionStrings[CommonSettings.IDSRV_CONNECTION_STRING].ConnectionString;
            services.AddMvc();

            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(options =>
            {
                // base-address of your identityserver
                options.Authority = "http://localhost:1839/"; 
                // name of the API resource
                options.Audience = "api1";

                options.RequireHttpsMetadata = false;
            });
services.AddAuthorization(options =>
            {
                options.DefaultPolicy = new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme)
                    .RequireAuthenticatedUser()
                    .Build();
            }
            );
var builder = services.AddIdentityServer(options => setupAction(options))
            .AddSigningCredential(loadCert())
            .AddInMemoryClients(Helpers.Clients.Get())          
            .AddInMemoryIdentityResources(Resources.GetIdentityResources())
            .AddInMemoryApiResources(Resources.GetApiResources()).AddDeveloperSigningCredential()          

            .AddConfigStoreCache().AddJwtBearerClientAuthentication()
            //Adds a key for validating tokens. They will be used by the internal token validator and will show up in the discovery document.
            .AddValidationKey(loadCert());

 builder.AddConfigStore(options =>
                {

                    //CurrentEnvironment.IsEnvironment("Testing") ?
                    // this adds the config data from DB (clients, resources)
                    options.ConfigureDbContext = dbBuilder => { dbBuilder.UseSqlServer(connStr); };
                })
            .AddOperationalDataStore(options =>
            {
                // this adds the operational data from DB (codes, tokens, consents)
                options.ConfigureDbContext = dbBuilder => { dbBuilder.UseSqlServer(connStr); };
                // this enables automatic token cleanup. this is optional.
                options.EnableTokenCleanup = true;
                options.TokenCleanupInterval = CommonSettings.TokenCleanupInterval;
            });
}

请告诉我,要获得JWT令牌需要进行哪些更改。预先感谢。

0 个答案:

没有答案