【问题标题】:Parsing a network path with credentials into base class library types将带有凭据的网络路径解析为基类库类型
【发布时间】:2012-05-28 00:33:00
【问题描述】:

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

  • \\host\share

您可以轻松地创建System.UriSystem.IO.DirectoryInfo 的实例,只需将该路径作为字符串传递给构造函数。

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

  • \\username@host\share
  • \\username:password@host\share

您不能简单地将这些传递给 Uri 或 DirectoryInfo 构造函数,因为它们不知道如何处理这些路径,这些路径主要由 linux 系统使用。此外,即使他们这样做了,他们也很可能不会保留登录凭据。

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

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

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

谢谢。

编辑

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

\\credential@host\path:没问题

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

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

【问题讨论】:

  • 呃,那些不是 UNC 路径。 UNC 路径不允许在其中嵌入用户名和密码信息。因此,不存在带有凭据的 UNC 路径之类的东西。
  • 啊,对不起。我想你是对的,但我想不出另一种说法。

标签: .net uri unc networkcredentials


【解决方案1】:

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

如果真的像你举的两个例子那么简单,我会蛮力的。制作一个简单的类,可以将路径拆分为其各自的组件(基于“@”的存在和位置)并分别创建 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

【讨论】:

  • +1 用于实际的代码解决方案,但是您如何预期名称中带有“@”符号的文件或目录?这实际上是我发布此问题的主要关注点和原因。我不知道如何区分实际路径之外的凭据。
  • 其实我认为这是为什么创建正则表达式的一个很好的例子......是时候调查了!
  • 您必须更具体地了解第一个 @ 是如何用斜杠排列的。我打算尝试用正则表达式来回答这个问题(主要是为了练习使用它们),但我分心了。更了解它们的人可能会觉得这很容易。
猜你喜欢
  • 2015-04-15
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
相关资源
最近更新 更多