2017-09-19 22 views
7

Tôi đang cố gắng thực hiện cuộc gọi HTTP GET từ ứng dụng giao diện điều khiển .NET Core 2.0. Điểm cuối mong đợi Windows Authentication.HttpClient, UseDefaultCredentials, Xác thực Windows, ứng dụng giao diện .NET Core 2.0 nhận 401 Unauthorized

Chương trình thử nghiệm của tôi thành công cho mục tiêu khung net45. Ngược lại, việc xây dựng netcoreapp2.0 nhận được 401 trái phép.

Đây là phương pháp của tôi:

using System; 
using System.Net; 
using System.Net.Http; 
using System.Net.Http.Headers; 
using System.Threading.Tasks; 

static async Task<string> Get(string serverUri, string requestUri) 
{ 
    var handler = new HttpClientHandler() { UseDefaultCredentials = true }; 
    var client = new HttpClient(handler) { BaseAddress = new Uri(serverUri) }; 
    return await client.GetStringAsync(requestUri); 
} 

Đây là tập tin dự án của tôi.

<Project Sdk="Microsoft.NET.Sdk"> 
    <PropertyGroup> 
    <OutputType>Exe</OutputType> 
    <TargetFrameworks>net45;netcoreapp2.0</TargetFrameworks> 
    </PropertyGroup> 
    <ItemGroup Condition="'$(TargetFramework)' != 'netcoreapp2.0'"> 
    <PackageReference Include="System.Net.Http" Version="4.3" /> 
    </ItemGroup> 
</Project> 

Chạy .\bin\Debug\net45\HttpClientTest.exe trả về kết quả JSON mong đợi.

Chạy dotnet .\bin\Debug\netcoreapp2.0\HttpClientTest.dll nhận 401 không được ủy quyền.

Unhandled Exception: System.AggregateException: One or more errors occurred. 
(Response status code does not indicate success: 401 (Unauthorized).) ---> 
System.Net.Http.HttpRequestException: Response status code does not indicate success: 401 (Unauthorized). 
    at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode() 
    at System.Net.Http.HttpClient.<GetStringAsyncCore>d__27.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
    at HttpClientTest.Program.<Get>d__1.MoveNext() in C:\temp\HttpClientTest\Program.cs:line 24 
    --- End of inner exception stack trace --- 
    at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) 
    at HttpClientTest.Program.Main(String[] args) in C:\temp\HttpClientTest\Program.cs:line 16 

Làm cách nào để khắc phục sự cố này?

Tôi cũng đã thử các biến thể dưới đây, mà không cần bất kỳ sự thay đổi về sản lượng:

handler.Credentials = CredentialCache.DefaultNetworkCredentials; 
handler.Credentials = CredentialCache.DefaultCredentials; 
handler.Credentials = new NetworkCredential(username, password, domain); 

Trả lời

0

Vì vậy, chúng tôi đang chạy vào cùng một vấn đề với HttpClient, nhưng theo yêu cầu đầu tiên nó không được cho phép, nhưng nếu chúng ta làm một cuộc gọi yêu cầu nhanh khác, nó chỉ diễn ra tốt đẹp và chúng tôi được ủy quyền.

Nếu tôi làm điều này trên một ứng dụng giao diện điều khiển .NET 4.7.1, nó hoạt động hoàn hảo. Nếu tôi làm điều đó trong một ứng dụng web rỗng 4.7.1. NET, nó hoạt động tốt, chỉ khi tôi làm .NET Core 2.x chúng ta có gặp vấn đề này không.

var result = string.Empty; 
var responseMessage = _client.GetAsync(url).Result; 

if (responseMessage.IsSuccessStatusCode) 
{ 
    result = await responseMessage.Content.ReadAsStringAsync(); 
} 
else 
{ 
    var responseMessage2 = _client.GetAsync(url).Result; 

    if (responseMessage2.IsSuccessStatusCode) 
    { 
     result = await responseMessage2.Content.ReadAsStringAsync(); 
    } 
} 

return result; 
Các vấn đề liên quan