如何在服务堆栈中使用Restrict属性

时间:2013-01-28 21:11:57

标签: servicestack

是否有关于[Restrict]属性与服务堆栈一起使用的文档?

没有找到任何文件,我开始尝试解决这个问题。我发现你必须在AppHost.cs配置事件中使用

启用限制
var endpointHostConfig = new EndpointHostConfig
        {
            EnableAccessRestrictions = true,
        };

然后我在我的请求DTO中添加了属性:

[Route("Hello/World", "GET")]
[Restrict(EndpointAttributes.InternalNetworkAccess)]

这不起作用......看起来会删除所有“默认”限制并用一个限制替换它?使用它似乎工作:

[Restrict(InternalOnly = true)]

当我从本地局域网执行GET时,它可以正常工作,但是从远程它不能。有趣的是,它从远程提供的“详细堆栈错误”是:

  

未达到以下限制:'\ n - [InternalNetworkAccess,Secure,HttpHead,HttpPost,HttpPut,HttpDelete,   HttpOther,OneWay,Soap11,Soap12,Xml,Jsv,ProtoBuf,Csv,Html,Yaml,MsgPack,FormatOther,AnyEndpoint]'

注意,它甚至没有列出HttpGet作为可能性之一 - 这确实有效。还提到了Secure而不是InSecure ......我都没有特别要求。

我们能否澄清一下它应该如何运作?如果我想要SSL,该怎么办?

如果我想在生产中要求SSL,但不为此端点的所有服务暂存,该怎么办? (实现这可能是一种完全不同的配置方式)。

1 个答案:

答案 0 :(得分:1)

[Restrict]属性功能位于最新版本的ServiceStack中。目前,唯一的文档存在于Security wiki page

以下是一些测试限制属性验证的EndpointAttributes restrictions tests,以及您可以使用的一些different service configurations

它的工作方式是它仅限于指定的任何内容,因此如果您想启用SSL并将其他所有内容保持为不受限制,则只需添加:

[Restrict(EndpointAttributes.Secure)]
public class SslOnly { }

它还支持指定允许的多种环境组合,例如:您可以在内部强制执行HTTP,但在外部使用HTTPS强制执行:

[Restrict(EndpointAttributes.Secure   | EndpointAttributes.External,
          EndpointAttributes.InSecure | EndpointAttributes.InternalNetworkAccess)]
public class SslExternalAndInsecureInternal { }

注意:每个环境都与Enum标志结合,并用,分隔。

但它不允许您区分调试版本和发布版本,为此,您需要使用C#条件编译符号。

例如,只允许用于Debug版本的HTTP和用于生产版本的HTTPS:

#if DEBUG
    [Restrict(EndpointAttributes.InSecure)]
#else
    [Restrict(EndpointAttributes.Secure)]
#endif
public class MyRequestDto { ... }