Запретить идентификацию пользователя кэша в EF Core 6C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Гость
 Запретить идентификацию пользователя кэша в EF Core 6

Сообщение Гость »


Я внедрил промежуточное программное обеспечение, чтобы проверить, есть ли у пользователя права доступа к конечным точкам или нет. В случае, если суперадминистратор изменяет активацию пользователя ПОСЛЕ, пользователь уже вошел в систему и получил токен доступа.

Но я столкнулся с проблемой с ядром EF, которое кэширует пользовательские данные после первого запроса, и при повторной проверке после изменения его данных непосредственно с SQL-сервера я получаю данные кэша, отличные от базы данных.

Промежуточное ПО

публичный класс CheckAuthorityMiddleware { частный RequestDelegate _next только для чтения; частный только для чтения UserManager _UserManager; частный только для чтения ITokenHandler _TokenHandler; частный только для чтения IUserService _UserService; public CheckAuthorityMiddleware (UserManager userManager, IUserService userService, ITokenHandler TokenHandler, RequestDelegate следующий) { _следующий = следующий; _UserManager = userManager; _TokenHandler = TokenHandler; _UserService = userService; } общедоступный асинхронный вызов задачи (контекст HttpContext) { List утверждает = _TokenHandler.GetTokenData(context.Request); если (утверждения равны нулю) дождитесь _next (контекст); еще { строка userId = претензии.FirstOrDefault(e => e.Type == ClaimTypes.Sid)!.Value; // Пользователь user = await _UserManager.FindByIdAsync(userId); Пользователь пользователя = ждут _UserService.FindById(userId); if (!user.IsActive || user.LockoutEnabled) { Веб-клиент веб-клиент = новый (); context.RequestAborted.Register(() => { вебКлиент.CancelAsync(); }); context.RequestAborted.ThrowIfCancellationRequested(); context.Response.StatusCode = (int)HttpStatusCode.Unauthorized; контекст.Прервать(); возвращаться; } дождитесь _next (контекст); } } } Program.cs

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); builder.Host.UseSerilog((_, config) => config.ReadFrom.Configuration(builder.Configuration)); builder.Services.Configure(параметры => { options.CheckConsentNeeded = контекст => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); builder.Services.CoreModuleDI(); builder.Services.InfrastructureModuleDI(); builder.Services.AddDbContext(options => { options.UseSqlServer(builder.Configuration. GetConnectionString("Соединение по умолчанию"); options.EnableServiceProviderCaching(false); }); builder.Services.AddControllersWithViews().AddNewtonsoftJson(); builder.Services.AddIdentity(параметры => { options.User.RequireUniqueEmail = false; options.Password.RequiredLength = 10; options.Stores.ProtectPersonalData = false; options.Password.RequiredUniqueChars = 4; }).AddEntityFrameworkStores().AddDefaultTokenProviders(); builder.Services.Configure (builder.Configuration.GetSection("JWTSettings")); builder.Services.AddAuthentication(опции => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(o => { o.RequireHttpsMetadata = false; о.SaveToken = ложь; o.TokenValidationParameters = новые параметры TokenValidationParameters { ValidateLifetime = правда, ValidateIssuerSigningKey = true, ValidateIssuer = ложь, Валидатаудиенс = ложь, ClockSkew = TimeSpan.Zero, ValidIssuer = builder.Configuration["JWTSettings:Issuer"], ValidAudience = builder.Configuration["JWTSettings:Audience"], IssuerSigningKey = новый SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["JWTSettings:Key"])) }; o.Events = новый JwtBearerEvents() { OnAuthenticationFailed = c => { в.НетРезультата(); //c.Response.StatusCode = 500; //c.Response.ContentType = "текст/обычный"; var result = JsonConvert.SerializeObject(new BaseResponseDto("Срок действия токена истек...")); вернуть c.Response.WriteAsync(результат); }, OnChallenge = контекст => { контекст.HandleResponse(); //context.Response.StatusCode = 401; //context.Response.ContentType = "application/json"; var result = JsonConvert.SerializeObject(new BaseResponseDto("Вы не авторизованы...")); вернуть context.Response.WriteAsync(результат); }, OnForbidden = контекст => { //context.Response.StatusCode = 403; //context.Response.ContentType = "application/json"; var result = JsonConvert.SerializeObject(new BaseResponseDto("У вас нет прав на доступ к этому ресурсу"); вернуть context.Response.WriteAsync(результат); }, }; }); builder.Services.AddAuthorization(); builder.Services.AddEndpointsApiExplorer(); вар приложение = builder.Build(); приложение.UseRouting(); app.UseHttpsRedirection(); приложение.UseStaticFiles(); приложение.UseCookiePolicy(); app.UseMiddleware(); приложение.UseAuthentication(); app.UseCors("MyForntEnd"); приложение.UseAuthorization(); app.UseErrorHandlingMiddleware(); приложение.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "Чистая архитектура"); }); app.UseEndpoints(конечные точки => { конечные точки.MapDefaultControllerRoute(); }); приложение.Выполнить(); Класс контекста базы данных, наследуемый от IdentityDbContext

публичный класс AppDbContext: IdentityDbContext { public AppDbContext(DbContextOptions options): base(options) { } // #region IdentitySchema public DbSet User {get; набор; } общественный DbSet Роль {get; набор; } #конечныйрегион защищенное переопределение void OnConfiguring (DbContextOptionsBuilder optionsBuilder) => optionsBuilder.ConfigureWarnings(предупреждения => предупреждения.Игнорировать(CoreEventId.NavigationBaseIncludeIgnored, CoreEventId.NavigationBaseIncluded)); защищенное переопределение void OnModelCreating (построитель ModelBuilder) { base.OnModelCreating(строитель); // builder.Entity(e => { e.ToTable(имя: «UserRoles»); }); builder.Entity( e=> { e.ToTable(name:"UserTokens"); e.Property(e => e.LoginProvider).HasDefaultValue(null); e.Property(e => e.Name).HasDefaultValue(null); }); builder.Entity(e => { e.ToTable(имя: «Логин пользователя»); }); // builder.ApplyAllConfigurationsFromCurrentAssembly(); } публичное переопределение int SaveChanges() { вернуть SaveChangesAsync().GetAwaiter().GetResult(); } } Класс пользователя, наследуемый от Identity User

публичный класс User: IdentityUser { общедоступная строка Имя {get; набор; } общественный bool IsActive {получить; набор; } общественный bool IsDelete {получить; набор; } общественная строка ManagerId {получить; набор; } публичная строка Пароль {get; набор; } = строка.Пусто; общественный DateTime CreationDate {получить; набор; } = ДатаВремя.UtcNow; публичный DateTime? Дата Модификации {получить; набор; } публичный виртуальный менеджер пользователей {get; набор; } } Какая часть отвечает за кэширование пользовательских данных в _dbContext?? И как это предотвратить или обновить???
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»