【问题标题】:C# helper classes to implement NTLM authorization用于实现 NTLM 授权的 C# 助手类
【发布时间】:2012-12-10 17:10:51
【问题描述】:

目前我正在尝试解决我的问题 — 以我认为应该如何工作的方式在我的 Intranet 站点上实施 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 授权的第一阶段。是否可以通过使用即用型助手来避免大量手动代码来实现其他步骤?

【问题讨论】:

  • 万一英语不是你的第一语言,你知道“牛仔程序员”是一个贬义词吗?
  • @Ben,你说得对,英语不是我的第一语言。但我知道“牛仔程序员”的成语。这是绝望引起的讽刺。支持如果 Windows 授权在 IIS、ASP.NET MVC 中很差,如我所见。而在南希,它根本不存在。而且我几乎需要不惜一切代价实施它......
  • 您可以 p/invoke SSPI msdn.microsoft.com/en-us/library/windows/desktop/… 并且您可能能够通过 NTLM 验证密码...这可能取决于您的用户的 AD 权限运行你的进程。但是为什么不直接在 IIS 下运行 Nancy 并让它处理身份验证呢?
  • @EdwardThomson 我试图让 Nancy 使用 IIS,但据我所知,我能得到的最好的结果是以下行为: IIS 在网站的第一页询问密码(而我需要保护只有个人资料区域),除非使用关闭浏览器,否则无法注销(而我需要或多或少地保持这种情况的灵活性)。
  • 我认为即使是虚拟路径,IIS 中也有配置设置,但我不知道。关于第二部分,SPNEGO (NTLM/Kerberos) 没有“注销”,这些凭据将始终在请求时提供(如果远程服务器是可信的)。

标签: c# ntlm nancy


【解决方案1】:

如果您真的想自己编写所有这些内容,我认为您需要完成一项艰巨的任务。此 URL 可能会对您有所帮助,它包含有关 NTLM 身份验证的一般信息,但也显示了使用 NTLM 进行 HTTP 身份验证的对话示例:

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

另一个可能的探索途径是查看 Mono 代码库中是否有任何您可以使用的东西 - 这就是我们使用内置 JSON 序列化程序所做的。

另一种选择是使用表单或基本身份验证,但根据 AD/LDAP 对用户名/密码进行身份验证。

【讨论】:

  • 我知道这可能是一项艰巨的任务...这就是为什么我要询问 C# 助手类...如果 Microsoft 没有它,这很奇怪。关于基本身份验证,是的......这是一种很好的出路。我会试试...谢谢!
  • 顺便说一下不是很大... 目前唯一缺少完成粗略和肮脏的实现 - 给定用户的 NT 密码哈希验证过程。但我找不到任何信息如何解决这个问题:stackoverflow.com/questions/13840679/…
  • 你这里说的是客户端还是服务器?我最近在 Mono 中做了很多 NTLMv2 相关的工作,但我们只为客户端实现了它。如果您正在查看特定的服务器端示例,我建议您查看 Samba 源代码。还有一个独立的命令行挑战/响应工具——我在单声道测试我的新 NTLMv2 代码时经常使用它。
  • 更多的是关于服务器。我已经看过 Mono 的 NTLMv2 代码,实际上我正在使用它来理解客户端提供给我的字节数组的内容,并编写对它的 Type2Message 响应。问题是我已经成功接收到 Type3Message 并且需要使用 C# 对其进行验证......目前我正在朝这个方向挖掘:pinvoke.net/default.aspx/secur32/InitializeSecurityContext.html 但目前还没有显着的结果。
【解决方案2】:

我已经开发并合并了几个来源,整个协议的工作实现: “NTLM”->“带有客户端数据的 NTLM”->“NTLM 挑战”->“来自客户端的 NTLM 挑战”,一切正常,无需外部库。唯一的小问题是所有 C++(讨厌在 C# :P 中玩缓冲区),它是一个 140kb C++ 源代码。 一切都可以在这里找到:https://kendar.org/?p=/dotnet/kendarntlmlib

--这里开始坏消息...--

据我在 IIS 上的理解,这种东西只能用作 ISAPI 过滤器。作为 NTLM 一个基于连接的协议,我无法在 MVC 控制器、aspx 页面或 ashx 处理程序中的同一个 http 请求中执行请求-响应-请求。并且 IIS 没有公开任何可用于“覆盖”http 的标准无连接方法但在 ISAPI 部分中的任何套接字句柄......(毕竟是 HTTP,但它正在削减我的翅膀:P)

我希望像在 Bonobo github 克隆上看到的基本身份验证属性一样使用它……但没有运气……

--在这里结束坏消息--

另外,我在将本机 DLL 加载到 C#-ANyCPU 编译项目中时遇到了一些问题,但这很容易:P(http://blogs.msdn.com/b/jorman/archive/2007/08/31/loading-c-assemblies-in-asp-net.aspx 仅供参考)

【讨论】:

    【解决方案3】:

    我需要一个使用 https://github.com/toolchain/Nancy.Authentication.Ntlm 的示例,其中用户限制了某些 Nancy 视图。谢谢!

    【讨论】:

    • 您是在提问还是发布答案?这似乎你在问一个问题,如果是这样,那么你应该发布一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    相关资源
    最近更新 更多