1

我正在为 LDAP 连接构建一个 URI。我知道微软确实支持使用ldap:///cn=...符号的无服务器绑定,并且该 URI 将与 .NET 一起使用,但如果指定了端口,UriBuilder 将不会生成正确的 URI。

例如:

var ub = new UriBuilder();
ub.Scheme = "ldap";
ub.Host = ""
// ---> ub.Uri.ToString() : "ldap:///"
ub.Port = 389
// ---> ub.Uri.ToString() : "ldap:///"
// ok, lets put non-standard port
ub.Port = 3899
// ---> ub.Uri.ToString() : "ldap:///"
ub.UserName = "user"
// ---> ub.Uri.ToString() : 
//      'ub.Uri' threw an exception of type 'System.UriFormatException'

编辑:注意:如果Host是“”,分配值Port没有效果,分配任何东西都会UserName产生异常的效果。

这是一个 .NET 问题,还是根本没有适合无服务器绑定的标准 URI?

4

1 回答 1

1

根据RFC3986,“权限”部分是可选的,但是,如果存在,“主机”是强制性的:

URI           = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

hier-part     = "//" authority path-abempty
              / path-absolute
              / path-rootless
              / path-empty

authority     = [ userinfo "@" ] host [ ":" port ]

因此,如果将“host”设置为空字符串,则无法设置“userinfo”和“port”。

我不熟悉 LDAP,因此不清楚您要生成什么 URI。如果 port 和 username 设置为非空字符串,但 host 为空,那么 URI 应该是什么样子?


.NET 明确支持 LDAP URI。这种支持归结为这些标志:

    private const UriSyntaxFlags LdapSyntaxFlags =
                                    UriSyntaxFlags.MustHaveAuthority | 
                                    //
                                    UriSyntaxFlags.AllowEmptyHost | 
                                    UriSyntaxFlags.AllowUncHost |
                                    UriSyntaxFlags.AllowAnInternetHost |
                                    // 
                                    UriSyntaxFlags.MayHaveUserInfo |
                                    UriSyntaxFlags.MayHavePort |
                                    UriSyntaxFlags.MayHavePath |
                                    UriSyntaxFlags.MayHaveQuery | 
                                    UriSyntaxFlags.MayHaveFragment |
                                    // 
                                    UriSyntaxFlags.PathIsRooted | 
                                    UriSyntaxFlags.AllowIdn |
                                    UriSyntaxFlags.AllowIriParsing; 

UriBuilder, 当这样构造时:

var ub = new UriBuilder {
    Scheme = "ldap", Host = "", Path = "/cn=...", UserName = "u", Password = "p", Port = 100
};

ToString()调用时产生此字符串:

ldap://u:p@/cn=...

但是,Uri使用此字符串创建将失败。我想这可以被认为是一个限制。这不是Uri's 限制的第一个案例。例如,它强制将 HTTP URI 中的路径解析为 Windows 路径,这可能很烦人,并且在某些情况下会导致错误。

如果您真正感兴趣的是 LDAP URI,也许您应该阅读 Active Directory 的文档。最简单的 URI 只是一个方案 + 一些字符串,其余的留给 URI 实现来决定,标准不强制任何东西。因此,即使某些 URI 遵循某些部分约定,也不能保证它们以“标准”方式进行。

于 2015-05-22T17:52:06.357 回答