.net 将具有凭据的网络路径解析为基类库类型

.net 将具有凭据的网络路径解析为基类库类型,.net,uri,unc,networkcredentials,.net,Uri,Unc,Networkcredentials,考虑以下简单windows网络共享(SMB协议)的UNC路径: \\host\share 通过将路径作为字符串传递给构造函数,可以轻松创建System.Uri或System.IO.DirectoryInfo的实例 现在考虑以下两条路径,将所有安全问题放在一边: \\username@host\共享 \\username:password@host\共享 您不能简单地将它们传递给Uri或DirectoryInfo构造函数,因为它们不知道如何处理这些路径,linux系统通常使用这些路径。此外

考虑以下简单windows网络共享(SMB协议)的UNC路径:

  • \\host\share
通过将路径作为字符串传递给构造函数,可以轻松创建
System.Uri
System.IO.DirectoryInfo
的实例

现在考虑以下两条路径,将所有安全问题放在一边:

  • \\username@host\共享
  • \\username:password@host\共享
您不能简单地将它们传递给Uri或DirectoryInfo构造函数,因为它们不知道如何处理这些路径,linux系统通常使用这些路径。此外,即使他们这样做了,他们也很可能不会保留登录凭据

最后,我想要一种方法将它们转换为表示实际路径的
System.Uri
实例和存储登录信息的
System.Net.NetworkCredential
实例

那么我该如何解决这个问题呢?我甚至不知道从哪里开始。从
System.UriParser
继承似乎是一个很好的起点,但根据MSDN,不建议这样做

Microsoft强烈建议您使用.NET Framework附带的解析器。构建自己的解析器会增加应用程序的复杂性,并且性能不如附带的解析器

谢谢

编辑

简单的解决方案(如下所示)是假设“@”符号之前的所有内容都是登录凭据的一部分,而它之后的所有内容都是实际路径。但是,当文件名包含“@”符号时,这可能会有问题

\\credential@host\路径
:没问题

\\credential@host\path@mystorage
:同样没有问题,因为第一个@之前的所有内容都是登录的一部分


\\host\path@mystorage
:现在我们完蛋了。当作为参数传递时,这肯定会引发参数异常。

如果这是您需要处理的仅有的两个方案,那么扩展解析器似乎有些过分。无论如何,创建自己的实用程序类会更容易

如果它真的像你给出的两个例子那么简单,我就用蛮力来解决它。创建一个简单的类,可以将路径拆分为其各自的组件(基于“@”的存在和位置),并分别创建Uri和NetworkCredential。如果字符串不包含“@”,则NetworkCredential可以为空

如果比这更复杂的话,我可能会偏离基准,但这听起来像是一个简单的解决方案可能会很好的时候

请原谅我的仓促代码,它不是完全容错的,但它应该说明问题

Public Class CredentialedPath

    Public Property Uri As Uri
    Public Property Credential As NetworkCredential

    Public Shared Function GetFromString(ByVal path As String) As CredentialedPath

        Dim CP As CredentialedPath = New CredentialedPath()

        Dim pathParts() As String = path.Split("@"c)

        If pathParts.Length > 1 Then

            CP.Uri = New System.Uri("\\" & pathParts(1))

            Dim credParts() As String = pathParts(0).TrimStart("\"c).Split(":"c)
            CP.Credential = New NetworkCredential()
            CP.Credential.UserName = credParts(0)
            If (credParts.Length > 1) Then
                CP.Credential.Password = credParts(1)
            End If

        Else
            CP.Uri = New System.Uri(path)
        End If

        Return CP

    End Function

End Class

呃,这些不是UNC路径。UNC路径不允许在其中嵌入用户名和密码信息。因此,不存在具有凭据的UNC路径。啊,对不起。我想你是对的,但我想不出另一种说法。实用代码解决方案是+1,但你如何预测名称中带有@符号的文件或目录?这实际上是我主要关心的问题,也是我提出这个问题的原因。我不知道如何区分凭证和实际路径。实际上,我认为这是一个很好的例子,说明了为什么要创建正则表达式。。。该调查了!您必须更详细地了解第一个@是如何用斜杠排列的。我本打算用正则表达式来回答这个问题(主要是为了练习使用它们),但我分心了。更了解他们的人可能会发现这相当容易。