2012-12-10 114 views
2

目前我試圖解決我的問題 - 這是在我的內部網站上以我應該如何工作的方式實現NTLM授權,即只在特定頁面上要求密碼。不只是打主頁 - 所以網站應該分爲兩部分:可用於所有和受限制的。C#幫助類實現NTLM授權

這個問題我使用Nancy框架,它本身並沒有實現NTLM。但這並不能阻止真正的牛仔程序員。所以我試圖開發定製的請求/響應序列來完成這個目標。

現在我已經發現this Q&A,但解決方案也被粘在IIS ...

我發現site有許多關於NTLM複雜的信息和我想知道是否有任何C#類來簡化這一過程?

即幫助創建不同類型的響應。

目前我的代碼看起來是這樣的:

Get["/Profile/"] = parameters => 
{ 
    var request = this.Request; 

    if (this.Request.Headers.Keys.Any(x => x == "Authorization")) 
    { 
     var items = Response.Context.Items; 

     var expert = new Expert(WindowsIdentity.GetCurrent()); 
     var model = expert.Ensure(); 

     return View["Profile.liquid", model]; 
    } 
    else 
    { 
     var response = new Response(); 
     response.StatusCode = HttpStatusCode.Unauthorized; 
     response.Headers.Add("WWW-Authenticate", "NTLM"); 
     return response; 
    } 
}; 

但它實現了NTLM授權的唯一的第一階段。是否可以避免大量的手動代碼來實現其他步驟,包括準備使用助手?

+0

爲了防止英語不是您的第一語言,您會意識到「牛仔程序員」是一個貶義詞嗎? –

+0

@本,你說得對,英語不是我的第一語言。但我知道「牛仔程序員」的成語。這是絕望造成的諷刺。如果Windows授權在IIS,ASP.NET MVC中表現不佳,就像我看到的那樣。在南希它根本不存在。我需要以幾乎任何成本實現它... – shytikov

+0

你可以調用SSPI http://msdn.microsoft.com/en-us/library/windows/desktop/aa380493(v=vs.85).aspx你*可能*能夠通過NTLM驗證密碼......它可能取決於你正在運行你的進程的用戶的AD權限。但爲什麼不只是在IIS下運行Nancy並讓它處理身份驗證? –

回答

1

如果你真的想自己寫這一切,我認爲你是一個巨大的任務。這個網址可以幫助你,但對一般的NTLM身份驗證信息,而且還展示了使用NTLM談話HTTP認證的例子:

http://davenport.sourceforge.net/ntlm.html#ntlmHttpAuthentication

另一種可能的途徑探討的是,看看是否有什麼在您可以使用的Mono代碼庫 - 這就是我們用內置的JSON序列化程序所做的。

另一種選擇是使用表單或基本認證,但是針對AD/LDAP認證用戶名/密碼。

+0

我知道這可能是一項艱鉅的任務...這就是爲什麼我要問關於C#助手類...如果微軟沒有它,這很奇怪。關於基本身份驗證,是的......這是很好的方式。我會嘗試一下......謝謝! – shytikov

+0

順便說一下,不是那麼巨大......目前唯一缺少的是完成粗糙和骯髒的實現 - 給定用戶的NT密碼哈希驗證過程。但我找不到任何信息如何解決:http://stackoverflow.com/questions/13840679/validate-nt-and-lm-hashes-against-active-directory – shytikov

+1

你在說這裏的客戶端或服務器嗎?我最近在Mono做了很多與NTLMv2相關的工作,但我們只是爲客戶端實施它。如果您正在查看特定的服務器端示例,我建議您查看Samba源代碼。還有一個獨立的命令行挑戰/響應工具 - 我在測試單聲道的新NTLMv2代碼時使用了很多。 –

1

我已經開發,合併了幾個來源,整個協議的工作實現: 「NTLM」 - >「帶客戶端數據的NTLM」 - >「NTLM挑戰」 - >「來自客戶端的NTLM挑戰」,一切正常並且不需要外部自由。只有很小的問題是所有的C++(討厭在C#中使用緩衝區:P),它是一個140kb的C++源代碼。 一切都可以在這裏找到:http://www.kendar.org/?development/cpp/ntlm-authentication-protocol.html

--HERE START壞消息...--

至於我在IIS理解這樣的事情只能工作作爲一個ISAPI篩選器。作爲基於NTLM的連接協議,我無法在MVC控制器,aspx頁面或ashx處理程序中的同一http請求中執行請求 - 響應請求。而IIS並沒有公開任何套接字句柄,它可以用來「覆蓋」http的標準無連接方式,但是在ISAPI部分中......(它畢竟是HTTP,但它削弱了我的翅膀:P)

我希望像使用Bonobo github克隆時使用的基本身份驗證屬性一樣使用它...但是沒有運氣。

--HERE FINISH BAD NEWS--

加上我有一些問題加載機DLL到C#編譯-ANyCPU項目,但是這很容易:(僅供參考http://blogs.msdn.com/b/jorman/archive/2007/08/31/loading-c-assemblies-in-asp-net.aspx)p