我使用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中的设置。
客户端将按预期工作。
答案 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 };