C# 如何使用dotnethttpclient获取完整的WWW-Authenticate报头? 脚本

C# 如何使用dotnethttpclient获取完整的WWW-Authenticate报头? 脚本,c#,azure,oauth,dotnet-httpclient,www-authenticate,C#,Azure,Oauth,Dotnet Httpclient,Www Authenticate,我正在为WindowsPhone8开发一个web程序(我认为这并不重要),并使用 问题 当用户尝试获取URL时,我需要知道当响应为401时需要什么类型的身份验证。 如果是NTLM、Basic、Digest等,这是非常容易的;所有受支持的计划。 您可以使用以下代码获取URL: HttpResponseMessage response; using (var httpClient = new HttpClient(httpHandler)) { HttpRequestMessage req

我正在为WindowsPhone8开发一个web程序(我认为这并不重要),并使用

问题 当用户尝试获取URL时,我需要知道当响应为401时需要什么类型的身份验证。 如果是NTLM、Basic、Digest等,这是非常容易的;所有受支持的计划。 您可以使用以下代码获取URL:

HttpResponseMessage response;
using (var httpClient = new HttpClient(httpHandler))
{
     HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, authenticationUri);
     response = await httpClient.SendAsync(request, _cancelTokenSource.Token);
}
检查需要哪种身份验证的最简单方法是使用
Headers.WwwAuthenticate.Contains
方法,例如检查是否需要
NTLM
方案:

string scheme = "NTLM";
bool requiredScheme = response.Headers.WwwAuthenticate.Contains(new System.Net.Http.Headers.AuthenticationHeaderValue(scheme));
如果
scheme=“Bearer”
则它总是给出false

获取响应头 尝试访问需要
Azure Active Directory
身份验证的服务器时获得以下信息

Jason Chrome应用程序 使用从web服务器获取响应头,我收到:

Pragma: no-cache
Date: Fri, 10 Oct 2014 11:39:02 GMT
WWW-Authenticate: Bearer authorization_uri="https://login.windows.net/common",
    error="invalid_token", 
    error_description="The access token is missing", 
    NTLM
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Expires: -1
Cache-Control: no-cache
Content-Length: 0
X-UA-Compatible: IE=EmulateIE7
网络Http客户端 使用HttpClient,
System.Net.Http.HttpResponseMessage
response
)提供:

WWW认证比较 根据上述结果,可以进行以下比较

Jason Chrome应用程序 承载授权\u uri=”https://login.windows.net/common", error=“无效的\u令牌”, 错误\u description=“缺少访问令牌”

NTLM

网络Http客户端 NTLM

承载部分被Http客户机丢弃(或者这可能是对HttpResponseMessage的限制),只剩下NTLM身份验证

问题: 如何或在何处使用显示所有方案及其内容的Dot NET HttpClient获取完整的WWW Authenticate标头?这个例子是针对持票人的;但是,也存在其他(自定义)方案

有什么想法吗


附加的
即使在您使用的是哪个.NET framework版本上,同样的问题似乎仍然存在?您好,我使用的是:Visual Studio 2013及其更新3。版本4.5.51641是否有一个公共服务器需要我们可以测试的这种身份验证?这是否提供了缺少的值;var value=r.Headers.WwwAuthenticate.Where((h)=>h.Scheme==“NTLM”).First()。Parameter@Yort我不知道有公共服务器,问题不在于NTLM,该方案是受支持的
WinHTTP
身份验证类型。问题在于任何不受支持的
WinHTTP
身份验证类型(如承载)的方案。
StatusCode: 401, ReasonPhrase: 'Unauthorized', Version: 0.0, Content: System.Net.Http.StreamContent, Headers:
    {
      Server: Microsoft-IIS/7.5
      WWW-Authenticate: NTLM
      X-Powered-By: ASP.NET
      X-UA-Compatible: IE=EmulateIE7
      Date: Fri, 10 Oct 2014 11:25:04 GMT
      Content-Length: 1293
      Content-Type: text/html
    }