Skip to content

fix: persist MCP OAuth signing/encryption keys in the database - #347

Open
JeyDim wants to merge 1 commit into
impworks:masterfrom
JeyDim:fix-mcp-signing-key-persistence
Open

fix: persist MCP OAuth signing/encryption keys in the database#347
JeyDim wants to merge 1 commit into
impworks:masterfrom
JeyDim:fix-mcp-signing-key-persistence

Conversation

@JeyDim

@JeyDim JeyDim commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

В production среде сервер OpenIddict использовал временные ключи подписи и шифрования, которые генерировались заново при каждом запуске.

Теперь ключи генерируются один раз и хранятся в базе данных (таблица OAuthKeys), а затем загружаются при последующих запусках, так что выданные токены остаются действительными при перезапусках.

Разработка по-прежнему опирается на сертификаты разработки фреймворка, которые уже сохраняются для каждого пользователя.

Closes #344.


// In production, supply the server's signing/encryption credentials from persistent keys
// stored in the database (development relies on the framework's development certificates).
if (Environment.EnvironmentName != "Development")

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Возможно, есть смысл использовать одинаковый подход в обоих случаях - и в проде, и во время разработки?

{
// Another instance generated the key concurrently: discard ours and reuse the stored one.
db.ChangeTracker.Clear();
var stored = db.OAuthKeys.First(x => x.Purpose == purpose);

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Код с загрузкой значения из базы по purpose, декодированием из base64 и загрузкой повторяется дважды - его можно вынести в локальную функцию

/// </summary>
public class OAuthKeyManager(IServiceScopeFactory scopeFactory)
{
private const string SigningPurpose = "Signing";

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Думаю что эти штуки можно было бы сделать enum'ом - чуть более строго типизировано, к тому же тогда PK в таблице был бы числовым. Но не принципиально.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[MCP/usability] singing key не сохраняется в БД

2 participants