2012-12-10 68 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