【问题标题】:HTTP Basic Authorization in .NET.NET 中的 HTTP 基本授权
【发布时间】:2013-02-12 18:40:55
【问题描述】:

也许我遗漏了什么,或者 .NET 遗漏了什么(最好是前者

在构建应用程序时(不只是 ASP.NET,这就是我的情况;特别是 ASP.NET 托管的 WCF DS),似乎没有本地方法可以创建 NetworkCredential 对象HttpRequest 或任何类似的请求/标头容器。

我们是否总是必须自己推出,或者System.Net.*System.Web.* 中是否隐藏着一些魔法,签名如下:

NetworkCredential GetAuthorization(HttpRequest request);

我知道这是微不足道的,但我会假设 HTTP 体系结构的标准内容将包含在其他内容如此广泛的内容中 (.NET)

那么,自制字符串操作,还是隐藏在某处的魔术方法?

【问题讨论】:

  • 您是否有特别想要或需要NetworkCredential 的原因?为什么User(和等价物)不够用?
  • 我指的是在大多数形式的 ASP.Net(WebForms、MVC、Web API)中都有一个方便的 User 属性,它为您提供了一个功能更全面的对象(通常实现 @ 987654331@ 或 IIdentity) 提供许多方便的功能。您想使用NetworkCredential 特有的哪些功能?
  • 我对上一条评论感到困惑NetworkCredential 不是绝对要求,但很合适;甚至描述都提到了 Basic、Digest 等。
  • 我目前没有使用 WebForms、MVC 或 Web API;而是托管 WCF 数据服务的 ASP.NET。我可以访问HttpRequest 等,并假设有/应该有一种方法可以从给定提供的 HTTP 授权标头的某个地方获取通用凭据对象 (NetworkCredential)。 NetworkCredential 没有任何具体的必要信息。我只是想知道 .NET 是否为我们提供了一些获取基于基本 HTTP 授权的通用凭证对象的方法,或者我是否坚持自己滚动。

标签: asp.net .net http-headers http-authentication


【解决方案1】:

我不认为有任何内置的;它的用途有限,因为大多数客户端使用 Kerberos 或 Digest 身份验证。

不过,自己动手制作相当简单:

static NetworkCredential ParseBasicAuthorizationHeader(string value)
{
   if (string.IsNullOrWhiteSpace(value)) 
   {
      return null;
   }
   if (!value.StartsWith("Basic ", StringComparison.OrdinalIgnoreCase)) 
   {
      return null;
   }

   byte[] data = Convert.FromBase64String(value.Substring(6));
   value = Encoding.GetEncoding("ISO-8859-1").GetString(data);

   int index = value.IndexOf(':');
   if (index == -1 || index == 0 || index == value.Length - 1) 
   {
      return null;
   }

   return new NetworkCredential(
      value.Substring(0, index),    // Username
      value.Substring(index + 1));  // Password
}

请记住,与所有其他 HTTP 标头一样,Authorization 标头完全由客户端控制,因此应被视为不受信任的用户输入。

【讨论】:

  • 感谢@RichardDeeming;我以前很怕那个。除了简单性之外,我有点惊讶于 .NET 不支持 Basic 浮动。无论如何,+1 让我注意到ISO-8859-1,我正在使用其他东西(ASCII 我认为
  • @Bracketworks:我在this SO answer中找到了编码;规范在这一点上似乎还不清楚,但大多数实现似乎都使用ISO-8859-1
  • 太棒了,谢谢。我将把它留在这里稍长一点,以防有人偶然发现来自 .NET 的灵丹妙药,但讨论这个问题的答案看起来很严峻(虽然对你有利)跨度>