如何在Microsoft.Rest.ServiceClient中使用Windows身份验证

时间:2018-04-18 14:19:23

标签: c# .net windows-authentication autorest

我使用Microsoft.Rest.ServiceClient生成autorest。我想访问使用Windows身份验证和基本身份验证保护的REST API。

目标是使用Windows身份验证。我尝试了如下:

var handler = new HttpClientHandler
{
    UseDefaultCredentials = true,
};
this.InitializeHttpClient(handler);

这不起作用,我得到:

System.Net.Http.HttpRequestException: An error occurred while sending the request. 
---> System.Net.WebException: The remote server returned an error: (401) Unauthorized. 
---> System.ComponentModel.Win32Exception: The target principal name is incorrect

当我使用基本身份验证时,它可以工作。

this.Credentials = new BasicAuthenticationCredentials
{
    UserName = Configuration.User,
    Password = Configuration.Password
};

ServiceClient的这种设置是在

的构造函数中完成的
MyClient : Microsoft.Rest.ServiceClient

我需要向客户端添加什么才能使Windows身份验证正常工作?

编辑:

看起来问题出在服务器端。 IIS中的设置。

客户端将按预期工作。

3 个答案:

答案 0 :(得分:1)

这基本上重申OP中已经涵盖的内容以及@Anders,我的首选语法......

 var windowsAuthHandler = new HttpClientHandler { UseDefaultCredentials = true };
 var webApiUri = new System.Uri("https://localhost:8080");
 var apiClient = new MyAutoRestClient(webApiUri ,windowsAuthHandler);

如果你正在略读,OP似乎表明这不起作用,确实如此。但是,正如OP后来所述,请确保从IIS开始,以确保它配置正确

答案 1 :(得分:0)

我使用类似的解决方案来传递Windows凭据,它运行良好。 唯一的区别是我使用$selectedInputValue = 0; // zero by default if(isset($_POST['segment']) && isset($_POST[$_POST['segment']])) $selectedInputValue = $_POST[$_POST['segment']]; 的构造函数重载,它接受function calculator() { if (isset($_POST['getdata'])) { $price = $_POST['price']; $stoploss = $_POST['stoploss']; $lowertrigger = 0.25; $Additional = 0.011; $selectedInputValue = 0; // zero by default if(isset($_POST['segment']) && isset($_POST[$_POST['segment']])) $selectedInputValue = $_POST[$_POST['segment']]; $X = $price * $selectedInputValue * $lowertrigger * $Additional; $Y = 0; // zero by default if ($selectedInputValue) { $Y = ($price - $stoploss) * $selectedInputValue; } if ($Y > $X) { echo "$Y"; } else { echo "$X"; } } } 实例,而不是调用ServiceClient,它看起来像这样:

HttpClientHandler

但是,401消息中“目标主体名称不正确”的部分看起来很可疑。您的问题可能来自AD配置中的某些问题,而不是InitializeHttpClient() - 配置中的问题。

答案 2 :(得分:0)

@bkwdesign有权利

var credentials = new Microsoft.Rest.BasicAuthenticationCredentials();
var handler = new System.Net.Http.HttpClientHandler() { UseDefaultCredentials = true };
var uri = new Uri("http://your-rest-api:8008");
var svc = new WebApplication1Client(uri, credentials, handler);

//WebApplication1Client : ServiceClient<WebApplication1Client>, IWebApplication1Client

这是将凭据从MVC传递到WebAPI Windows身份验证或模拟凭据的方法

也许其他选择:

var handler = new HttpClientHandler() { Credentials = CredentialCache.DefaultCredentials };
var handler = new HttpClientHandler() { Credentials = CredentialCache.DefaultNetworkCredentials };