Проверка подлинности и авторизация в .Net Core 5 и Angular 10 с использованием проблемы JWT

#api #.net-core #asp.net-web-api #jwt

Вопрос:

Здравствуйте, я пытаюсь выполнить авторизацию с помощью токена JWT, поэтому, когда не авторизованный пользователь запрашивает api или услугу запроса, он отклоняет,

Я использовал токен JWT с ролью утверждения и сделал столбец Задания в своей базе данных в качестве роли, чтобы он получил от нее роль

проблема в том, что я не могу расшифровать токен или tbh, я изо всех сил старался с помощью идентификатора расшифровать его, но я уверен, что не могу

это мой стартап.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 =gt;  {  options.AddPolicy("EnableCORS", Builder =gt;  {  Builder.AllowAnyOrigin()  .AllowAnyHeader()  .AllowAnyMethod();  });  });  services.AddDbContextlt;media_cloudContextgt;(option =gt; option.UseSqlServer(Configuration.GetConnectionString("MediaCloudCS")));  services.AddScopedlt;ILoginService, LoginServicegt;();  services.AddControllers();  services.AddSwaggerGen(c =gt;  {  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 =gt; c.SwaggerEndpoint("/swagger/v1/swagger.json", "MediaCloudApi v1"));  }   app.UseHttpsRedirection();   app.UseCors("EnableCORS");   app.UseRouting();   app.UseAuthentication();   app.UseAuthorization();   app.UseEndpoints(endpoints =gt;  {  endpoints.MapControllers();  });  } }  

Я добавил пакет JWT и попытался добавить схему по умолчанию, но она не может ее определить, и единственное, что доступно, — это расширение jwtbearerext

это моя служба создания токенов

 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);  } }  

and that’s the get request from the controller

 [HttpGet,Authorize] public async Tasklt;ActionResultlt;IEnumerablelt;UserInfogt;gt;gt; GetUserInfos() {  return await _context.UserInfos.ToListAsync(); }  

and the error code from postman STATUS 500 INTERNAL SERVER ERROR

 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(Actionlt;AuthenticationOptionsgt; 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

Ответ №1:

вы должны добавить в службы конфигурации(службы IServiceCollection) вашего файла запуска код, аналогичный этому

 var key = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["Tokens:Key"]));   services.AddAuthentication(x =gt;  {  x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;  x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;  })  .AddJwtBearer(x =gt;  {  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.json

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