有无无服务器绑定的URI的主机名



我正在为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'

EDIT:注意:如果Host是",给Port赋值没有效果,给UserName赋值有异常效果。

这是一个。net问题,还是真的没有一个合适的标准URI用于无服务器绑定?

根据RFC3986,Part是可选的,但是,如果它存在,则"host";是强制性的:

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是什么。如果端口和用户名设置为非空字符串,但主机为空,那么预期的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局限性的第一个案例。例如,它强制将HTTP uri中的路径解析为Windows路径,这在某些情况下可能会令人讨厌并导致错误。

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

相关内容

  • 没有找到相关文章

最新更新