C# 手动Windows身份验证

C# 手动Windows身份验证,c#,asp.net,.net,odata,ntlm,C#,Asp.net,.net,Odata,Ntlm,我目前正试图弄清楚如何在我们的ASP.NET应用程序中执行手动windows身份验证。问题是我们有一个OData服务正在运行,并使用FormsAuthentication提供通用登录机制,并允许OData的PUT&DELETE谓词,包括表单重定向 但是,对于某些客户,我们集成了Windows身份验证,以便他们的用户能够顺利地与active directory集成。现在的问题是,我们希望能够在不中断Odata服务的情况下切换身份验证方法,因为我们依赖于Odata服务 我们尝试使用IhttpModu

我目前正试图弄清楚如何在我们的ASP.NET应用程序中执行手动windows身份验证。问题是我们有一个OData服务正在运行,并使用FormsAuthentication提供通用登录机制,并允许OData的PUT&DELETE谓词,包括表单重定向

但是,对于某些客户,我们集成了Windows身份验证,以便他们的用户能够顺利地与active directory集成。现在的问题是,我们希望能够在不中断Odata服务的情况下切换身份验证方法,因为我们依赖于Odata服务

我们尝试使用IhttpModule模拟Windows身份验证机制。到目前为止,我们能够打开和关闭该功能,并且在发出请求时,我们会遇到挑战。我不知道如何使用从浏览器接收到的信息对active directory执行身份验证:

这是我们用于从当前请求中提取NTLM信息的代码:

/// <summary>
/// <para>Determines whether the current <see cref="HttpRequest"/> is a NTML challenge.</para>
/// </summary>
/// <param name="request">The <see cref="HttpRequest"/> to evaluate.</param>
/// <param name="header">The output header to authenticate.</param>
/// <returns>True if the current <see cref="HttpRequest"/> is considered a NTML challenge.</returns>
 protected bool IsNtlmChallenge(HttpRequest request, out string header)
 {
      const string headerName = @"Authorization";
      if (request.Headers.AllKeys.Contains(headerName))
      {
           header = request.Headers[headerName];
           return true;
      }

      header = string.Empty;
      return false;
 }
希望有人能提供我需要的答案。

好的

根据收到的对我的问题的评论,我提出了以下解决方案来绕过我遇到的问题。我知道这不是一个干净的解决方案,但至少对我们有效

  • 创建在应用程序内部运行的新Web应用程序
  • 此子应用程序依赖于Windows身份验证
    • 禁用匿名身份验证和表单身份验证
  • 创建处理Windows身份验证的Login.aspx页面
  • 我们在登录后生成cookie并重定向到原始应用程序
  • 原始应用程序识别cookie并接收用户
这要求我们为两个应用程序生成相同的加密和解密密钥。这可以使用应用程序的IIS管理器中的机器密钥模块进行设置如果两个应用程序的密钥不相等,cookie的编码/解码过程将失败。我们将它们设置为使用SHA1自动生成,但两个应用程序的密钥相同

现在,我们检查原始登录页面上的设置,如果需要Windows身份验证,则重定向到子应用程序的登录页面,并在那里执行登录。然后我们重定向回原始登录页面,并使用cookie继续


这会导致在初次登录时出现一些重定向,但之后应用程序会一如既往地平稳运行。

好问题-等待好答案!我怀疑是否有可能以这种方式混合窗体和windows身份验证。对于winauth,您必须在IIS中启用它(因为IIS将验证这些凭据),并且win auth和forms auth不能在某些IIS设置中协同工作(例如,IIS7+集成应用程序池)。此外,您只能在web.config中指定一种身份验证模式。使用经典应用程序池时,您可以混合使用auth,但不能在相同的文件/文件夹上。如果这是您正在运行的,请在特定文件夹/文件/url路径(例如,aspx处理程序)上启用win auth,然后使用该处理程序对win/AD用户进行身份验证。请尝试以下帖子:我们知道使用辅助站点,但这是最后的选择。我真的希望有人能先想出解决这个问题的办法。
// Check if we need to handle authentication through Windows authentication or not.
if (WindowsAuthentication)
{
    string encryptedHeader;

    // If this is a challenge from the client, perform the Windows Authentication using the 
    // information stored inside the header.
    if(IsNtlmChallenge(HttpContext.Current.Request, out encryptedHeader))
    {
         /* how to authenticate here with the encrypted header? */
    }

    HttpContext.Current.Response.AddHeader("WWW-Authenticate", "NTLM");
    HttpContext.Current.Response.StatusCode = 401;
    return;
}