C# 手动Windows身份验证
我目前正试图弄清楚如何在我们的ASP.NET应用程序中执行手动windows身份验证。问题是我们有一个OData服务正在运行,并使用FormsAuthentication提供通用登录机制,并允许OData的PUT&DELETE谓词,包括表单重定向 但是,对于某些客户,我们集成了Windows身份验证,以便他们的用户能够顺利地与active directory集成。现在的问题是,我们希望能够在不中断Odata服务的情况下切换身份验证方法,因为我们依赖于Odata服务 我们尝试使用IhttpModule模拟Windows身份验证机制。到目前为止,我们能够打开和关闭该功能,并且在发出请求时,我们会遇到挑战。我不知道如何使用从浏览器接收到的信息对active directory执行身份验证: 这是我们用于从当前请求中提取NTLM信息的代码: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
/// <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并接收用户
这会导致在初次登录时出现一些重定向,但之后应用程序会一如既往地平稳运行。好问题-等待好答案!我怀疑是否有可能以这种方式混合窗体和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;
}