не может получить доступ к токену JWT, поскольку CORS использует .NetCore - PullRequest
0 голосов
/ 28 апреля 2020

У меня очень странная проблема на задней стороне моего приложения, вот мой запуск:

    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.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);       
        string securityKey = "My_First_Key_generated_by_myself";
        var semetricSecurityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(securityKey));
        services.AddCors(options =>
        {
            options.AddPolicy(
              "EnableCORS",
              builder => builder.AllowAnyOrigin()
              .AllowAnyMethod()
              .AllowAnyHeader()
              .AllowCredentials().Build());
        });
        services.AddAuthentication().AddJwtBearer(
            options =>
            {

                options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
                {

                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = "morteza",
                    ValidAudience = "pass",
                    IssuerSigningKey = semetricSecurityKey


                };


            }
            );


    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        app.UseAuthentication();

        //app.UseHttpsRedirection();
        app.UseCors("EnableCORS");

        app.UseMvc();
    }

Мой контроллер аутентификации для генерации токена:

  [HttpPost("token")]
  //  [Authorize]
    public ActionResult GetToken(string username)
    {
        //  return Ok("hi Morteza");
        if (username == "morteza") { 
        string securityKey = "My_First_Key_generated_by_myself";
        var semetricSecurityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(securityKey));

        var claims = new List<Claim>();
        claims.Add(new Claim(ClaimTypes.Role, "Admin"));


        var signIncredentials = new SigningCredentials(semetricSecurityKey, SecurityAlgorithms.HmacSha256Signature);
        var token = new JwtSecurityToken(
            issuer: "morteza",
            audience: "pass",
            expires: DateTime.Now.AddHours(1),
            claims: claims,
            signingCredentials: signIncredentials);



        return Ok(new JwtSecurityTokenHandler().WriteToken(token));
    }

            else
        {

            return null;
        }

        }

У меня есть понятия не имею, почему я получаю Доступ к XMLHttpRequest в 'https://localhost: 44361 / api / Auth / token / ' from origin 'http://localhost: 4200 ' заблокирован политикой CORS : На запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin», когда я использую его на внешнем интерфейсе?

1 Ответ

0 голосов
/ 29 апреля 2020

Вам необходимо позвонить app.UseCors() до app.UseAuthentication(), потому что ваш код в данный момент пытается аутентифицироваться до применения политики CORS.

Ваш Configure метод должен выглядеть следующим образом:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    // Moved this line 
    app.UseCors("EnableCORS");

    app.UseAuthentication();

    //app.UseHttpsRedirection();

    app.UseMvc();
}

См. Документацию по заказу промежуточного программного обеспечения и рекомендуемый заказ для общих служб

...