我可以让HttpWebRequest包括windows凭据而不等待401挑战吗?

本文关键字:等待 挑战 HttpWebRequest 包括 windows 我可以 | 更新日期: 2023-09-27 18:06:34

我的应用程序与需要身份验证的内部web API通信。

当我发送请求时,我像预期的那样收到401挑战,握手发生,经过身份验证的请求被重新发送,一切都很好。

但是,我知道需要验证。为什么我要等挑战呢?我可以强制请求在第一个请求中发送凭据吗?

我的请求生成是这样的:

   private static HttpWebRequest BuildRequest(string url, string methodType)
   {
       var request = HttpWebRequest.CreateHttp(url);
       request.PreAuthenticate = true;
       request.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested;
       request.Credentials = CredentialCache.DefaultNetworkCredentials;
       request.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;
       request.ContentType = CONTENT_TYPE;
       request.Method = methodType;
       request.UserAgent = BuildUserAgent();
       return request;
   }

即使使用此代码,初始请求中也不包含验证头。

我知道如何包含验证信息与基本....我想做的是使用执行应用程序的用户的Windows认证(所以我不能在配置文件中存储密码)。

UPDATE我也尝试使用HttpClient和它自己的.Credentials属性具有相同的结果:没有授权头添加到初始请求。

唯一的方法是使用基本的身份验证(这在这个用例中是行不通的)

我可以让HttpWebRequest包括windows凭据而不等待401挑战吗?

Ntlm是一个基于挑战/响应的身份验证协议。您需要发出第一个请求,以便服务器可以发出挑战,然后在随后的请求中,客户端向挑战发送响应。然后,服务器通过向域控制器提供客户端发送的挑战和响应来验证此响应。如果不知道挑战,你就不能发送响应,这就是为什么需要2个请求。

基本身份验证是基于密码的,所以你可以通过在第一个请求时发送凭据来缩短这一过程,但根据我的经验,这对于一些服务器来说可能是一个问题。

更多细节请点击这里:http://msdn.microsoft.com/en-us/library/windows/desktop/aa378749 (v = vs.85) . aspx

我不是100%确定,但我怀疑这是没有办法的;这就是HttpWebRequest的工作方式。

在这里的在线。net源代码中,函数DoSubmitRequestProcessing,您可以在函数开始之后看到这个注释,第1731行:

        // We have a response of some sort, see if we need to resubmit
        // it do to authentication, redirection or something
        // else, then handle clearing out state and draining out old response.

再往下一点(第1795行)(为了简洁,删除了一些行)

if (resubmit)
{   
   if (CacheProtocol != null && _HttpResponse != null) CacheProtocol.Reset();
   ClearRequestForResubmit(ntlmFollowupRequest);
   ...
}

ClearRequestForResubmit第5891行:

// We're uploading and need to resubmit for Authentication or Redirect.

然后(第5923行):

// The second NTLM request is required to use the same connection, don't close it
     if (ntlmFollowupRequest) {....}

在我看来(不可否认n00bish),这些评论似乎表明开发人员决定遵循NTML/Kerberos的"标准"挑战-响应协议,而不包括任何预先发送身份验证头的方式。

设置PreAuthenticate是您想要的,您正在做的。第一个请求仍将进行握手,但对于后续请求,它将自动发送凭据(基于所使用的URL)。你可以在这里阅读:http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.preauthenticate(v=vs.110).aspx.