2013-02-12 101 views
1

也许我失去了一些东西,或者也许是.NET是失去了一些东西(最好是前者HTTP基本授权在.NET

当建立一个应用程序(不是唯一ASP.NET,但这就是我的的情况;特别是一个ASP.NET托管的WCF DS)似乎没有本地的方式来创建一个NetworkCredential对象HttpRequest,或任何类似的请求/头容器。

难道一定要推出我们自己的,或者是有一些神奇的藏在System.Net.*System.Web.*与像签名:

NetworkCredential GetAuthorization(HttpRequest request); 

这是微不足道的,我知道,但我会承担一些标准的HTTP架构将包含在其他方面如此包含的东西(.NET

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

+0

是否有你特别想要或需要一个'NetworkCredential'的原因?为什么'User'(和等价物)不够? – 2013-02-12 18:43:45

+0

我指的是在大多数ASP.Net(WebForms,MVC,Web API)形式中都有一个方便的'User'属性,它提供了一个更加全面的对象(通常实现'IPrincipal'或'IIdentity')它提供了许多方便的功能。你想使用什么功能,特定于“NetworkCredential”? – 2013-02-12 18:51:07

+0

(*我与我最后的评论*相混淆)“NetworkCredential”不是绝对的要求,而是合适的;甚至说明中提到了Basic,Digest等。 – Dan 2013-02-12 18:51:35

回答

1

我不认为有什么内置的;它的用途有限,因为大多数客户端使用Kerberos或摘要式身份验证。

然而,这是相当简单推出自己的:

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

+0

谢谢@RichardDeeming;我以前很怕那个。简单的说,我有点惊讶,不支持基于.NET的基础。在任何情况下,+1引起'ISO-8859-1'的注意,我正在使用别的东西(*'ASCII'我认为*) – Dan 2013-02-12 19:40:57

+0

@Bracketworks:我发现编码在[这个SO答案](http ://stackoverflow.com/a/7243567/124386);规范似乎在这一点上还不清楚,但大多数实现似乎使用“ISO-8859-1”。 – 2013-02-12 19:47:29

+0

太棒了,谢谢。我将在这里留下一点时间,如果有人用.NET的魔力子弹闯入,但讨论这个问题的答案看起来很严峻(*虽然对你有利)* – Dan 2013-02-12 22:09:20