ServiceStack AutoQuery и атрибут [Authenticate]

Я хотел бы включить проверку подлинности для некоторых автозапросов.

[Authenticate]
public class BusinessEntitiesService : QueryDb<DataModel.dbo.BusinessEntity>
{
}

Вот моя проблема. Вышеупомянутый класс находится в моем проекте ServiceModel... чтобы добавить атрибут [Authenticate], мне нужно добавить ссылку на ServiceStack.dll, которая, я думаю, может вызвать проблемы в будущем (согласно предыдущему руководству только ссылаться на ServiceStack. Интерфейсы в ServiceModel). Я не могу добавить вышеупомянутый класс в ServiceInterfaces, потому что тогда мне придется ссылаться на это везде, где я использую клиента.

Я также попытался использовать GlobalRequestFilter... но, похоже, с этим плагин AdminFeature не работает:

    private bool IsAProtectedPath(string path)
    {
        return !path.StartsWith("/auth") && !path.StartsWith("/autoquery");
    }

        GlobalRequestFilters.Add((httpReq, httpResp, requestDto) =>
        {
            if(IsAProtectedPath(httpReq.PathInfo))
                new AuthenticateAttribute().Execute(httpReq, httpResp, requestDto);
        });

Не совсем уверен, как лучше всего справиться с этим.

1 ответ

Решение

Для того, чтобы применить [Authenticate] Присвойте атрибуты AutoQuery Services вам необходимо создать собственную реализацию AutoQuery и применить к ней атрибуты Filter, например:

[Authenticate]
public class MyProtectedAutoQueryServices : Service 
{
    public IAutoQueryDb AutoQuery { get; set; }

    public object Any(QueryBusinessEntity query) =>
        AutoQuery.Execute(query, AutoQuery.CreateQuery(query, Request));

    public object Any(QueryBusinessEntity2 query) =>
        AutoQuery.Execute(query, AutoQuery.CreateQuery(query, Request));
}

Альтернативой является динамическое добавление атрибутов в DTO AutoQuery Request, но их необходимо зарегистрировать до Configure() называется, либо раньше appHost.Init() или в вашем конструкторе AppHost, например:

public class AppHost : AppHostBase
{
    public AppHost()
    {
        typeof(QueryBusinessEntity)
            .AddAttributes(new AuthenticateAttribute());
    }
}
Другие вопросы по тегам