Пользовательский запрос аутентификации в ServiceStack для мультитенантности

Я уже использую пользовательский провайдер аутентификации в своем приложении веб-сервисов на основе ServiceStack.

Я переопределяю метод Authenticate и проверяю моего пользователя по одной из нескольких базовых баз данных клиентов. В настоящее время я определяю базу данных арендаторов, сопоставляя ключ API со строкой базы данных.

public override object Authenticate(
   IServiceBase authService, 
   IAuthSession session, 
   Auth request) // <- custom object here, MyCustomAuth request
{
   // ...
}

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

Я хотел изменить объект Auth, чтобы я мог включить TenantId (предоставленный пользователем при входе в систему). Тем не менее, я не вижу, как я могу настроить этот объект.

Есть ли способ настроить этот объект Auth или мне нужно найти альтернативное решение?

1 ответ

Решение

Вы не можете изменить встроенный Authenticate Запрос DTO используется, но вы можете использовать его Dictionary<string, string> Meta свойство для отправки дополнительных метаданных с запросом аутентификации, например:

client.Post(new Authenticate {
    ...
    Meta = new Dictionary<string,string> {
        {"TenantId", tenantId},
    }
}

В качестве альтернативы вы можете отправить дополнительную информацию в заголовках QueryString или HTTP и получить доступ к IRequest с:

var tenantId = authService.Request.QueryString["TenantId"];
Другие вопросы по тегам