1

也许我遗漏了一些东西,或者 .NET 遗漏了一些东西(最好是前者

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

我们是否总是必须自己滚动,或者是否有一些魔法隐藏System.Net.*System.Web.*带有签名,例如:

NetworkCredential GetAuthorization(HttpRequest request);

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

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

4

1 回答 1

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标头完全由客户端控制,因此应被视为不受信任的用户输入。

于 2013-02-12T19:30:35.197 回答