【问题标题】:Apache NTLM Auth from C# client do not work with self defined NetworkCredentials来自 C# 客户端的 Apache NTLM Auth 不适用于自定义 NetworkCredentials
【发布时间】:2012-10-25 10:09:26
【问题描述】:

我有一个使用 HttpWebRequest 连接服务的 office 插件。

在域内我通过CredentialCache.DefaultNetworkCredentials 所以一切都很好。 在域外,用户需要提供用户名、域和密码。 这在自动取款机上不起作用。

其中部分代码:

CookieContainer cookies = new CookieContainer();

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = WebRequestMethods.Http.Post;
request.AllowAutoRedirect = true;
request.CookieContainer = cookies; // provide session cookie to handle redirects of login controller of the webservice

if (isWindowAuthentication) // isWindowAuthentication is set earlier by config
{
  if (Common.UserName.Length > 0)
  {
    string[] domainuser;
    string username;
    string domain;

    if (Common.UserName.Contains("@"))
    {
      domainuser = Common.UserName.Split('@');
      username = domainuser[0];
      domain = domainuser[1];
    }
    else
    {
      domainuser = Common.UserName.Split('\\');
      username = domainuser[1];
      domain = domainuser[0];
    }
    NetworkCredential nc = new NetworkCredential(username, Common.Password, domain);
    CredentialCache cache = new CredentialCache();
    cache.Add(request.RequestUri, "NTLM", nc);
    request.Credentials = cache;
  }
  else
  {
    request.Credentials = CredentialCache.DefaultNetworkCredentials;
  }
}

稍后我会提出请求request.GetResponse();。 如果我使用CredentialCache.DefaultNetworkCredentials,那么一切正常。 当我切换到我自己的new NetworkCredential() 部分时,身份验证失败。

我检查了 Apache 的日志(它是使用 SSPI mod 的 Apache 2.2)。 当它成功时,第一个请求重定向到登录控制器,然后登录控制器请求凭据。通过并工作(重定向到目标站点)。

日志 1(有效):

192.168.14.9 - - [25/Oct/2012:11:35:35 +0200] "POST /ror/ioi/start?document%5Bguid%5D=%7Be3d8f1de-10f2-4493-a0c0-97c2acb034e6%7D HTTP/1.1" 302 202
192.168.14.9 - - [25/Oct/2012:11:35:35 +0200] "GET /ror_auth/login?ror_referer=%2Fror%2Fioi%2Fstart%3Fdocument%255Bguid%255D%3D%257Be3d8f1de-10f2-4493-a0c0-97c2acb034e6%257D HTTP/1.1" 401 401
192.168.14.9 - - [25/Oct/2012:11:35:35 +0200] "GET /ror_auth/login?ror_referer=%2Fror%2Fioi%2Fstart%3Fdocument%255Bguid%255D%3D%257Be3d8f1de-10f2-4493-a0c0-97c2acb034e6%257D HTTP/1.1" 401 401
192.168.14.9 - rausch [25/Oct/2012:11:35:35 +0200] "GET /ror_auth/login?ror_referer=%2Fror%2Fioi%2Fstart%3Fdocument%255Bguid%255D%3D%257Be3d8f1de-10f2-4493-a0c0-97c2acb034e6%257D HTTP/1.1" 302 156

这里自己的凭证结果Log 2(不工作):

192.168.14.9 - - [25/Oct/2012:12:05:23 +0200] "POST /ror/ioi/start?document%5Bguid%5D=%7B6ac54e8a-19f1-4ccd-9684-8d864dd9ccf7%7D HTTP/1.1" 302 202
192.168.14.9 - - [25/Oct/2012:12:05:23 +0200] "GET /ror_auth/login?ror_referer=%2Fror%2Fioi%2Fstart%3Fdocument%255Bguid%255D%3D%257B6ac54e8a-19f1-4ccd-9684-8d864dd9ccf7%257D HTTP/1.1" 401 401

我不明白的是当我检查时CredentialCache.DefaultNetworkCredentials.UserName 然后是空的。

任何人都知道该怎么做以及我必须如何正确设置自己的凭据以使身份验证按预期工作?

【问题讨论】:

    标签: c# httpwebrequest networkcredentials


    【解决方案1】:

    最后经过大量的测试和调查以及堆栈溢出的许多资源后,我发现了发生了什么。

    问题似乎是httpwebrequest 不处理身份验证,当部分网站请求凭据时,有些则不处理。

    背景:

    我们的网站有自己的会话管理,并在没有有效会话可用时重定向到登录控制器。只有此登录控制器设置为 NTLM 身份验证。

    我们这样做是因为我们有一个完全没有 NTLM 身份验证的网站(IE 中没有 401、302 请求循环!)并且只验证一次(并且我们在不同的 url 上处理身份验证以防止 IE 停止在未经身份验证的网站 => 请参阅 http://support.microsoft.com/?id=251404)。

    解决方案:

    我通常在我的目标页面上发送一个请求,然后网络服务器重定向、验证并重定向回目标。由于如果我有自己的凭据集,httpwebrequest 不会出于任何原因处理此问题(请参阅上面的问题代码),我更改为代码以对我的登录控制器进行一次身份验证并将会话存储在 cookie 容器中。

    对于所有以下请求,我不再进行身份验证。我添加了 cookie 容器,我的服务器获得了一个有效的会话。所以我不必再进行身份验证了。这样的副作用是性能更好。

    另一个棘手的事情是,我不仅使用了 httpwebrequest,还使用了 webform 控件。 因此我找到了在此处添加我自己的 cookie 会话的解决方案:Use cookies from CookieContainer in WebBrowser(感谢 Aaron 也为我省去了很多麻烦)。

    【讨论】:

      猜你喜欢
      • 2023-01-18
      • 1970-01-01
      • 2023-02-17
      • 2023-02-20
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多