Asp.net core mvc Jwt令牌始终返回401.NETCore3.1WebAPI

Asp.net core mvc Jwt令牌始终返回401.NETCore3.1WebAPI,asp.net-core-mvc,jwt,Asp.net Core Mvc,Jwt,我是Jwt的新手。我创建了运行在3.1版本和我的配置上的新web api public void ConfigureServices(IServiceCollection services) { services.AddControllers(); JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); var symmetricKey = ne

我是Jwt的新手。我创建了运行在3.1版本和我的配置上的新web api

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
            var symmetricKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("mysupersecretkeytosharewithnooneandalwaysinsideapp"));
            TokenValidationParameters tokenValidationParameters = new TokenValidationParameters
            {
                ValidIssuer = "Management",
                ValidateIssuer = true,
                ValidAudience = "Management",
                ValidateAudience = true,
                ValidateLifetime = true,
                IssuerSigningKey = symmetricKey,
                ValidateIssuerSigningKey = true,
            };
            services.AddCors();
            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(options =>
            {
                options.RequireHttpsMetadata = false;
                options.SaveToken = true;
                options.TokenValidationParameters = tokenValidationParameters;
            });
            services.AddHttpContextAccessor();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {

            app.UseRouting();
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseCors(q => q.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod());
            app.UseAuthentication();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
        public static string GenerateToken(string jwtKey, string jwtExpireMinutes)
        {
            var claims = new List<Claim>()
            {
                new Claim(ClaimTypes.NameIdentifier,"C280298D-D896-49E2-96AD-5C82243F9048"),
                new Claim(ClaimTypes.Email,"mfa@gmail.com"),
            };
            var keyByte = Encoding.UTF8.GetBytes(jwtKey);
            var signInKey = new SymmetricSecurityKey(keyByte);
            var expireMinutes = DateTime.Now.AddMinutes(Convert.ToDouble(jwtExpireMinutes));
            var token = new JwtSecurityToken(claims: claims, expires: expireMinutes, signingCredentials: new SigningCredentials(signInKey, SecurityAlgorithms.HmacSha256));

            return new JwtSecurityTokenHandler().WriteToken(token);

        }
我的代币生成器类就是这样

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
            var symmetricKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("mysupersecretkeytosharewithnooneandalwaysinsideapp"));
            TokenValidationParameters tokenValidationParameters = new TokenValidationParameters
            {
                ValidIssuer = "Management",
                ValidateIssuer = true,
                ValidAudience = "Management",
                ValidateAudience = true,
                ValidateLifetime = true,
                IssuerSigningKey = symmetricKey,
                ValidateIssuerSigningKey = true,
            };
            services.AddCors();
            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(options =>
            {
                options.RequireHttpsMetadata = false;
                options.SaveToken = true;
                options.TokenValidationParameters = tokenValidationParameters;
            });
            services.AddHttpContextAccessor();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {

            app.UseRouting();
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseCors(q => q.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod());
            app.UseAuthentication();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
        public static string GenerateToken(string jwtKey, string jwtExpireMinutes)
        {
            var claims = new List<Claim>()
            {
                new Claim(ClaimTypes.NameIdentifier,"C280298D-D896-49E2-96AD-5C82243F9048"),
                new Claim(ClaimTypes.Email,"mfa@gmail.com"),
            };
            var keyByte = Encoding.UTF8.GetBytes(jwtKey);
            var signInKey = new SymmetricSecurityKey(keyByte);
            var expireMinutes = DateTime.Now.AddMinutes(Convert.ToDouble(jwtExpireMinutes));
            var token = new JwtSecurityToken(claims: claims, expires: expireMinutes, signingCredentials: new SigningCredentials(signInKey, SecurityAlgorithms.HmacSha256));

            return new JwtSecurityTokenHandler().WriteToken(token);

        }
这些是结果


这是因为在验证代币时,您在jwt代币中检查了
aud
(观众)和
iss
(发行人)声明:

ValidIssuer = "Management",
ValidateIssuer = true,
ValidAudience = "Management",
ValidateAudience = true,
因此,在创建令牌时,您应该添加这些正确的声明,否则令牌验证将无法通过:

var token = new JwtSecurityToken(audience: "Management", issuer: "Management", claims: claims, expires: expireMinutes, signingCredentials: new SigningCredentials(signInKey, SecurityAlgorithms.HmacSha256));

是的,谢谢!。我花了两个小时来发现这些错误:(