.Net Core 5 和 Angular 10 中的身份验证和授权使用 JWT 问题

Authentication and Authorization in .Net Core 5 and Angular 10 using JWT problem

您好,我正在尝试使用 JWT 令牌进行授权,因此当未授权用户请求 api 或请求服务时,它会拒绝,

我已将 JWT 令牌与声明角色一起使用,并将数据库中的作业列作为角色,以便它从中获取角色

问题是我无法解码令牌或 tbh 我在身份的帮助下尽力解码它但我肯定不能

那是我的 startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication();

        services.AddCors(options =>
        {
            options.AddPolicy("EnableCORS", Builder =>
             {
                 Builder.AllowAnyOrigin()
                 .AllowAnyHeader()
                 .AllowAnyMethod();
             });
        });
        services.AddDbContext<media_cloudContext>(option => option.UseSqlServer(Configuration.GetConnectionString("MediaCloudCS")));
        services.AddScoped<ILoginService, LoginService>();
        services.AddControllers();
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new OpenApiInfo { Title = "MediaCloudApi", Version = "v1" });
        });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseSwagger();
            app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "MediaCloudApi v1"));
        }

        app.UseHttpsRedirection();

        app.UseCors("EnableCORS");

        app.UseRouting();

        app.UseAuthentication();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

我添加了 JWT 包并尝试添加默认方案,但它无法定义它和唯一可用的 JWTBearerExtension

这是我的令牌创建服务

public class TokenHelper
{
    public const string Issuer = "http://MediaCloud.com";
    public const string Audience = "http://MediaCloud.com";

    public const string Secret = "OFRC1j9aaR2BvADxNWlG2pmuD392UfQBZZLM1fuzDEzDlEpSsn+btrpJKd3FfY855OMA9oK4Mc8y48eYUrVUSw==";

    public static string GenerateSecureSecret()
    {
        var hmac = new HMACSHA256();
        return Convert.ToBase64String(hmac.Key);
    }

    public static string GenerateToken(UserInfo user)
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Convert.FromBase64String(Secret);

        var claimsIdentity = new ClaimsIdentity(new[] {
            new Claim(ClaimTypes.Name, user.Id.ToString()),
            new Claim(ClaimTypes.Role, user.Job),


        });
        var signingCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature);

        var tokenDescriptor = new SecurityTokenDescriptor
        {
            
            Subject = claimsIdentity,
            Issuer = Issuer,
            Audience = Audience,
            Expires = DateTime.Now.AddMinutes(15),
            SigningCredentials = signingCredentials,

        };
        var token = tokenHandler.CreateToken(tokenDescriptor);
        return tokenHandler.WriteToken(token);
    }
}

这是来自控制器的获取请求

[HttpGet,Authorize]
public async Task<ActionResult<IEnumerable<UserInfo>>> GetUserInfos()
{
    return await _context.UserInfos.ToListAsync();
}

和邮递员的错误代码 状态 500 内部服务器错误

System.InvalidOperationException: No authenticationScheme was specified, and there was no DefaultChallengeScheme found. The default schemes can be set using either AddAuthentication(string defaultScheme) or AddAuthentication(Action<AuthenticationOptions> configureOptions).
   at Microsoft.AspNetCore.Authentication.AuthenticationService.ChallengeAsync(HttpContext context, String scheme, AuthenticationProperties properties)
   at Microsoft.AspNetCore.Authorization.Policy.AuthorizationMiddlewareResultHandler.HandleAsync(RequestDelegate next, HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

HEADERS
=======
Accept: */*
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 69
Content-Type: application/json
Host: localhost:44371
User-Agent: PostmanRuntime/7.28.4
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6IjciLCJyb2xlIjoiYWRtaW4iLCJuYmYiOjE2MzU5NzMyMDYsImV4cCI6MTYzNTk3NDEwNiwiaWF0IjoxNjM1OTczMjA2LCJpc3MiOiJodHRwOi8vTWVkaWFDbG91ZC5jb20iLCJhdWQiOiJodHRwOi8vTWVkaWFDbG91ZC5jb20ifQ.QjOC2ixirm9zmMmFDRO28JPd1Q97mq_M8bxlmmgT8EU
Postman-Token: 3911736a-ea2b-4273-ba35-d0315a560e71

我认为问题出在默认架构上,但我无法添加它,而且我是 .net core 的新手

您必须在启动文件的 ConfigureServices(IServiceCollection services) 中添加与此类似的代码

var key = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["Tokens:Key"]));

            services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(x =>
            {
                x.RequireHttpsMetadata = false;
                x.SaveToken = true;
                x.TokenValidationParameters = new TokenValidationParameters
                {
                    IssuerSigningKey = key,
                    ValidateIssuerSigningKey = true,
                    ValidateLifetime = true,
                    ValidateIssuer = false,
                    ValidAudience =Configuration["Tokens:Audience"] ,
                    ValidateAudience = true
                };
            });

最好使用 appsettings 来保留令牌参数,然后对它们进行硬编码。将这样的东西添加到 appsettings.json

"Tokens": {
    "Key": "xxxxxx"
    "Audience": "xxxxx",
    "Issuer": "xxxx"
  }