如何在C#中从URL解析用户凭据?

12

我有一个链接,格式如下:

http://user:pass@example.com

如何从这个URL中获取userpass


5
你实际上尝试了什么?预期结果是什么?如果你没有得到你所期望的结果,你实际上得到了什么?很抱歉,这不是一个“给我代码”的网站 - 如果不清楚,请阅读常见问题解答。 - Brian Driscoll
3
从常见问题解答中得知:“你应该只提出基于实际问题的实用、可回答的问题。”和“我们都在这里一起学习。对那些可能不知道你所知道的一切的人要保持宽容。” - Peter Hedberg
更好的问题是如何删除它 :P - Jay
2个回答

20

1
只有在凭据中没有“@”符号时才能正常工作(通常用于用户名为电子邮件地址或强密码)。 - Kenneth LeFebvre
注意:在 Uniform Resource Identifier(URI)中,“@”是一个保留字符,由 RFC 规定。请参阅 https://tools.ietf.org/html/rfc3986#page-12。你会发现,在用户名或密码中包含许多字符,可能会使 URI 无效。 - supertopi
1
是的,当我们这样做时,最终我们会解析出凭据并在添加它们之前对它们进行 HttpUtility.UrlEncode。Windows资源管理器将接受未编码的凭据(这是我们的用户将它们复制/粘贴到我们的应用程序中的地方)。此外,UriBuilder在构建URI时不会对其进行编码。我希望“构建器”能够处理这样的事情;必须在将其传递给解析器之前解析它们非常麻烦。 :) - Kenneth LeFebvre

6

我将这个想法进一步完善,并编写了一些URI扩展程序,以分离用户名和密码。想要分享我的解决方案。

public static class UriExtensions
{
    public static string GetUsername(this Uri uri)
    {
        if (uri == null || string.IsNullOrWhiteSpace(uri.UserInfo))
            return string.Empty;

        var items = uri.UserInfo.Split(new[] { ':' });
        return items.Length > 0 ? items[0] : string.Empty;
    }

    public static string GetPassword(this Uri uri)
    {
        if (uri == null || string.IsNullOrWhiteSpace(uri.UserInfo))
            return string.Empty;

        var items = uri.UserInfo.Split(new[] { ':' });
        return items.Length > 1 ? items[1] : string.Empty;
    }
}

未能解析域名。 - Jay
谢谢,这对我很有帮助 :) - gakera
我们经常需要同时使用两者。https://gist.github.com/duongphuhiep/13f104e4229bf7e1869921e034834ec6 - Hiep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接