2

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

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

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,但不想在此端点的所有服务上登台怎么办?(意识到这可能是一种完全不同的配置方式)。

4

1 回答 1

1

[Restrict]属性特性在最新版本的 ServiceStack 中。目前唯一的文档存在于安全 wiki 页面中。

以下是一些EndpointAttributes 限制测试,用于测试限制属性的验证,以及您可以使用的一些不同服务配置。

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

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

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

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

注意:每个环境都与枚举标志组合并用,.

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

例如,仅允许 HTTP 用于 Debug 构建和 HTTPS 用于生产 Release 构建:

#if DEBUG
    [Restrict(EndpointAttributes.InSecure)]
#else
    [Restrict(EndpointAttributes.Secure)]
#endif
public class MyRequestDto { ... }
于 2013-01-28T22:24:42.170 回答