2013-02-12 103 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