ServiceStack AutoQuery 和 [Authenticate] 属性

ServiceStack AutoQuery and [Authenticate] Attribute

我想对某些自动查询强制执行身份验证。

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

这是我的问题。上面的 class 在我的 ServiceModel 项目中...为了添加 [Authenticate] 属性,我需要添加对 ServiceStack.dll 的引用,我认为这可能会导致问题(根据之前的仅在 ServiceModel 中引用 ServiceStack.Interfaces 的指导)。我不能将上面的 class 添加到 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);
        });

不太确定如何最好地处理这个问题。

为了将 [Authenticate] 属性应用于自动查询服务,您需要创建一个 custom AutoQuery implementation 并在其上应用您的过滤器属性,例如:

[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));
}

另一种方法是将属性动态添加到您的 AutoQuery Request DTO,但这些属性需要在调用 Configure() 之前注册,可以在 appHost.Init() 之前或在您的 AppHost 构造函数中注册,例如:

public class AppHost : AppHostBase
{
    public AppHost()
    {
        typeof(QueryBusinessEntity)
            .AddAttributes(new AuthenticateAttribute());
    }
}