Interceptor и хедер запроса с фронта на Angular к беку .NET Core

95
18 марта 2021, 05:40

Простой контроллер на выход из учетной записи

[Authorize]
[HttpPost("logout")]
public async Task<IActionResult> Logout([FromBody]AuthTokenDTO dto)

Я реализовал интесептор для установки хедера запросов. Интерсептер сложный в моей реализации. Но суть не в это.

Метод логаут на бек-енде у меня с атрибутом [Authorize] не заходит и хедер не цеплял в интесептере(я так думал). Если атрибут на контроллере снимаю то заходит и нормально приходит модель для разлогирования.

Снова повторю я уверен был что нету хедера да и во вкладке Network его и не было.У меня интерсептер был замудреный и я решил его сделать максимально простым что б 100% хедер цеплялся. Вот простой интерсептер который ципляет хедер и на логаут тоже. В Networke он уже есть при запросе.

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const jwt = this.tokenService.readJwtToken();
if(jwt != null){
  request = request.clone({
    setHeaders: {
      Authorization: `Bearer ` + jwt.AccessToken
    }
  });
}
return next.handle(request);
}

И тут он снова не работает даже с правильным хедером. Данный метод хедера у меня всегда работал на .Core. Может быть еще в чем-то проблема?? Если снимаю атрибут авторизации то снова работает. Почему когда правильный хедер установлен???

Startup

public class Startup
{
    private readonly ILogger<Startup> Logger;
    public Startup(IConfiguration configuration, ILogger<Startup> logger)
    {
        Configuration = configuration;
        Logger = logger;
    }
    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.InitializeServices();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        // In production, the Angular files will be served from this directory
        services.AddSpaStaticFiles(configuration =>
        {
            configuration.RootPath = "***********";
        });
        services.AddDbContext<ApplicationDBContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        services.AddIdentityCore<User>(opts =>
        {
            opts.Password.RequiredLength = 5;   // минимальная длина
            opts.Password.RequireNonAlphanumeric = false;   // требуются ли не алфавитно-цифровые символы
            opts.Password.RequireLowercase = true; // требуются ли символы в нижнем регистре
            opts.Password.RequireUppercase = true; // требуются ли символы в верхнем регистре
            opts.Password.RequireDigit = true; // требуются ли цифры
        }).AddRoles<IdentityRole>()
          .AddEntityFrameworkStores<ApplicationDBContext>()
          .AddDefaultTokenProviders();
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info { Title = "********* API", Version = "v1" });
            c.AddSecurityDefinition("Bearer", new ApiKeyScheme { In = "header", Description = "Please enter JWT with Bearer into field", Name = "Authorization", Type = "apiKey" });
            c.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>> {
            { "Bearer", Enumerable.Empty<string>() },
        });
        });

    }
    // 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.IsEnvironment("Testing"))
        {
            Logger.LogInformation("In test environment");
        }
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            Logger.LogInformation("In development environment");
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }
        app.UseAuthentication();
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseSpaStaticFiles();
        app.UseSwagger();
        // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), 
        // specifying the Swagger JSON endpoint.
        app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "********** API V1");
            c.RoutePrefix = "swagger";
        });
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller}/{action=Index}/{id?}");
        });
        app.UseSpa(spa =>
        {
            // To learn more about options for serving an Angular SPA from ASP.NET Core,
            // see https://go.microsoft.com/fwlink/?linkid=864501
            spa.Options.SourcePath = "***********";
            if (env.IsDevelopment())
            {
                spa.UseAngularCliServer(npmScript: "start");
            }
        });

    }
}
Answer 1

У вас включен механизм авторизации asp.net core identity. При этом этот механизм можно настроить как для cookies аутентификации, так и для аутентификации по jwt-токенам.

У вас в приложении включен только дефолтный механизм - через куки. Поэтому все ваши запросы шли всегда неавторизованными.

В принципе, если вы работаете только через angular приложение то вам и не нужна авторизация через куки - просто отключите её и включите авторизацию по токенам.

Здесь же описывается более сложный пример - когда одновременно есть и приложение asp.net core, которое использует механизм identity и jwt для api контроллеров и каждый механизм используется раздельно (используя куки нет доступа к api и токены не дают доступа к контроллерам asp.net core приложения).

READ ALSO
Hash сумма для контроля версий файлов

Hash сумма для контроля версий файлов

Есть игровой клиент в котором около 2000 файлов размером от нескольких килобайт до сотен мегабайтВсе файлы бинарные, т

114
mysql join count

mysql join count

Есть запрос:

94
Создание dblink к БД MySQL

Создание dblink к БД MySQL

Необходимо создать dblink к БД MysqlПросьба помочь

146
Выполнение миграций в консоли yii2

Выполнение миграций в консоли yii2

Есть проектВ нем есть миграции

110