JoinRpg.Common.WebInfrastructure
2026.8.12
dotnet add package JoinRpg.Common.WebInfrastructure --version 2026.8.12
NuGet\Install-Package JoinRpg.Common.WebInfrastructure -Version 2026.8.12
<PackageReference Include="JoinRpg.Common.WebInfrastructure" Version="2026.8.12" />
<PackageVersion Include="JoinRpg.Common.WebInfrastructure" Version="2026.8.12" />
<PackageReference Include="JoinRpg.Common.WebInfrastructure" />
paket add JoinRpg.Common.WebInfrastructure --version 2026.8.12
#r "nuget: JoinRpg.Common.WebInfrastructure, 2026.8.12"
#:package JoinRpg.Common.WebInfrastructure@2026.8.12
#addin nuget:?package=JoinRpg.Common.WebInfrastructure&version=2026.8.12
#tool nuget:?package=JoinRpg.Common.WebInfrastructure&version=2026.8.12
JoinRpg.Common.WebInfrastructure
Общая веб-инфраструктура для ASP.NET Core приложений JoinRpg: логирование (Serilog), OpenTelemetry, Data Protection, кеширование, health checks, поддержка PostgreSQL, логин через id.joinrpg.ru.
Подключение
1. Настройка хоста (Program.cs)
Настройте Serilog как провайдер логирования, передав имя приложения:
builder.Host.UseJoinSerilog("MyApp.Name");
2. Регистрация сервисов
services.AddJoinWebPlatform(
configuration: Configuration,
environment: Environment,
appName: "MyApp.Name",
dataProtectionConnectionStringName: "DataProtection",
telemetryServiceNames: ["MyApp.ActivitySourceName"]
);
Опционально — конфигурация имён хостов JoinRpg (нужна, если приложение использует JoinRpgHostNamesOptions):
services.Configure<JoinRpgHostNamesOptions>(
Configuration.GetSection("JoinRpgHostNames")
);
3. Подключение DbContext (если нужно)
Регистрация DbContext с PostgreSQL и health check:
services.AddJoinEfCoreDbContext<MyDbContext>(
Configuration, Environment,
connectionStringName: "MyDatabase"
);
Для запуска миграций через Joinrpg.Dal.Migrate:
services.RegisterMigrator<MyDbContext>(
Configuration, Environment,
connectionStringName: "MyDatabase"
);
4. Логин через id.joinrpg.ru (OpenIddict client)
Для сателлитных сайтов, авторизующих пользователей через id.joinrpg.ru (authorization code flow):
services.AddJoinRpgAuthentication<MyDbContext>(Configuration);
services.AddScoped<IJoinUserLoginHandler, MyUserLoginHandler>();
MyDbContext — контекст, в котором OpenIddict хранит своё состояние (authorization/token records). В его OnModelCreating нужно вызвать modelBuilder.UseOpenIddict() (пакет OpenIddict.EntityFrameworkCore).
IJoinUserLoginHandler — приложение-специфичная часть логина: получив UserIdentification и внешний ClaimsPrincipal от id.joinrpg.ru, реализация должна создать/обновить локального пользователя и дополнить список claims, с которыми он будет залогинен по cookie-схеме:
internal class MyUserLoginHandler(MyDbContext dbContext) : IJoinUserLoginHandler
{
public async Task HandleLoginAsync(UserIdentification userId, ClaimsPrincipal externalPrincipal, List<Claim> claims, CancellationToken cancellationToken)
{
// найти/создать локального пользователя по userId, дополнить claims
}
}
В pipeline замаппить эндпойнты /login, /signin-joinrpg, /logout:
app.MapAuthEndpoints();
Конфигурация (секция JoinRpgOidc). Issuer по умолчанию — https://id.joinrpg.ru/, указывать нужно только для отличного от прода окружения (dev/staging):
{
"JoinRpgOidc": {
"ClientId": "my-app",
"ClientSecret": "..."
}
}
Получить id пользователя из текущего ClaimsPrincipal: user.GetJoinrpgUserId().
5. Middleware pipeline
app.UseForwardedHeaders(); // Должен быть первым — обрабатывает X-Forwarded-* заголовки
app.UseOpenTelemetryPrometheusScrapingEndpoint(); // Эндпойнт /metrics
app.UseJoinRequestLogging(); // Логирование HTTP-запросов через Serilog
// ... остальной pipeline ...
app.MapJoinHealthChecks(); // Эндпойнты /health, /health/ready, /health/live
6. MVC/Razor Pages фильтры (опционально)
Для обогащения логов данными из MVC/Razor Pages контекста:
options.Filters.Add<SerilogMvcFilter>();
options.Filters.Add<SerilogRazorPagesFilter>();
Состав функционала
| Компонент | Класс/Метод | Описание |
|---|---|---|
| Логирование | UseJoinSerilog(), UseJoinRequestLogging() |
Serilog с обогащением (пользователь, трассировка, YC-уровни), JSON/text форматтеры, фильтрация health check запросов |
| Data Protection | AddJoinDataProtection() (вызывается из AddJoinWebPlatform) |
Хранение ключей шифрования в PostgreSQL для работы в нескольких репликах |
| OpenTelemetry | AddJoinOpenTelemetry() (вызывается из AddJoinWebPlatform) |
Distributed tracing + метрики, Prometheus endpoint /metrics |
| Кеширование | PerRequestCache<K,V>, SingletonCache<K,V> |
Per-request scoped кеш и singleton-кеш с фабрикой значений |
| Health Checks | MapJoinHealthChecks() |
Эндпойнты /health (полный), /health/ready (тег ready), /health/live (всегда OK) |
| Forwarded Headers | UseForwardedHeaders() / ConfigureForwardedHeaders() |
Обработка X-Forwarded-Proto и X-Forwarded-For от reverse proxy |
| DbContext | AddJoinEfCoreDbContext<T>() |
PostgreSQL + EntityFramework.Exceptions + health check для каждого контекста |
| Миграции | RegisterMigrator<T>() |
Регистрация DbContext + IMigratorService для применения миграций |
| Логин через id.joinrpg.ru | AddJoinRpgAuthentication<T>(), MapAuthEndpoints(), IJoinUserLoginHandler |
OpenIddict client (authorization code flow), cookie-схема, эндпойнты /login, /signin-joinrpg, /logout |
| Конфигурация хостов | JoinRpgHostNamesOptions |
Имена хостов всех сервисов JoinRpg (основной сайт, IdPortal, KogdaIgra, рейтинг) |
| MVC фильтры | SerilogMvcFilter, SerilogRazorPagesFilter |
Обогащение логов данными из HTTP-контекста для MVC и Razor Pages |
Требования по конфигурации
appsettings.json
{
"ConnectionStrings": {
"DataProtection": "Host=localhost;Port=5432;Database=joinrpg;Username=joinrpg;Password=..."
},
"Logging": {
"Structured": false,
"SelfLogEnabled": false,
"LogLevel": {
"Default": "Information",
"Microsoft": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"JoinRpgHostNames": {
"MainHost": "joinrpg.ru",
"IdHost": "id.joinrpg.ru",
"KogdaIgraHost": "kogda-igra.ru",
"RatingHost": "rating.bastilia.ru"
}
}
Описание параметров
ConnectionStrings
| Ключ | Обязателен | Описание |
|---|---|---|
DataProtection |
Да | Строка подключения PostgreSQL для хранения ключей Data Protection |
| Любой другой | По необходимости | Строки подключения для каждого DbContext, зарегистрированного через AddJoinEfCoreDbContext |
Logging
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
Structured |
bool | false |
true — JSON-формат логов (для production/Elasticsearch), false — текстовый формат (для разработки) |
SelfLogEnabled |
bool | false |
Включить вывод внутренних ошибок Serilog в stderr |
LogLevel |
Dictionary | {} |
Уровни логирования по категориям (аналог стандартного Logging:LogLevel) |
JoinRpgHostNames
| Параметр | Описание |
|---|---|
MainHost |
Основной сайт JoinRpg (например, joinrpg.ru) |
IdHost |
Портал аккаунтов (например, id.joinrpg.ru) |
KogdaIgraHost |
Сервис KogdaIgra |
RatingHost |
Сервис рейтинга Бастилии |
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- AspNetCore.HealthChecks.NpgSql (>= 9.0.0)
- AspNetCore.HealthChecks.UI.Client (>= 9.0.0)
- EntityFrameworkCore.Exceptions.PostgreSQL (>= 10.0.1)
- JoinRpg.Common.PrimitiveTypes (>= 2026.8.12)
- Microsoft.AspNetCore.DataProtection.EntityFrameworkCore (>= 10.0.11)
- Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore (>= 10.0.11)
- Microsoft.EntityFrameworkCore (>= 10.0.11)
- Npgsql.EntityFrameworkCore.PostgreSQL (>= 10.0.3)
- OpenIddict.Client.AspNetCore (>= 7.6.1)
- OpenIddict.Client.SystemNetHttp (>= 7.6.1)
- OpenIddict.EntityFrameworkCore (>= 7.6.1)
- OpenTelemetry.Api (>= 1.18.0)
- OpenTelemetry.Exporter.Prometheus.AspNetCore (>= 1.11.0-beta.1)
- OpenTelemetry.Extensions.Hosting (>= 1.18.0)
- OpenTelemetry.Instrumentation.AspNetCore (>= 1.18.0)
- OpenTelemetry.Instrumentation.Http (>= 1.18.0)
- Serilog (>= 4.4.0)
- Serilog.AspNetCore (>= 10.0.0)
- Serilog.Enrichers.Environment (>= 3.0.1)
- Serilog.Expressions (>= 5.0.0)
- Serilog.Sinks.Console (>= 6.1.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2026.8.12 | 99 | 9/6/2026 |
| 2026.8.0 | 117 | 9/2/2026 |
| 2026.7.34 | 77 | 8/26/2026 |
| 2026.7.32 | 186 | 8/26/2026 |
| 2026.7.14 | 97 | 8/24/2026 |
| 2026.7.10 | 65 | 8/23/2026 |
| 2026.5.26 | 180 | 8/4/2026 |
| 2026.3.87 | 164 | 5/12/2026 |
| 2026.3.77 | 100 | 5/11/2026 |
| 2026.3.76 | 89 | 5/11/2026 |
| 2026.3.72 | 73 | 5/8/2026 |
| 2026.3.71 | 68 | 5/8/2026 |
| 2026.3.67 | 68 | 5/7/2026 |