Простой контроллер на выход из учетной записи
[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");
}
});
}
}
У вас включен механизм авторизации asp.net core identity. При этом этот механизм можно настроить как для cookies аутентификации, так и для аутентификации по jwt-токенам.
У вас в приложении включен только дефолтный механизм - через куки. Поэтому все ваши запросы шли всегда неавторизованными.
В принципе, если вы работаете только через angular приложение то вам и не нужна авторизация через куки - просто отключите её и включите авторизацию по токенам.
Здесь же описывается более сложный пример - когда одновременно есть и приложение asp.net core, которое использует механизм identity и jwt для api контроллеров и каждый механизм используется раздельно (используя куки нет доступа к api и токены не дают доступа к контроллерам asp.net core приложения).
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть игровой клиент в котором около 2000 файлов размером от нескольких килобайт до сотен мегабайтВсе файлы бинарные, т