ServiceStack AutoQuery和[Authenticate]属性

时间:2016-06-30 18:17:53

标签: servicestack servicestack-auth servicestack-autoquery

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

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

enter image description here

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

1 个答案:

答案 0 :(得分:2)

为了将[Authenticate]属性应用于AutoQuery Services,您需要创建一个custom AutoQuery implementation并在其上应用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));
}

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

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