如果通过主机名访问 API,则 RestSharp 和 NTLM 身份验证不起作用
RestSharp and NTLM authentication does not work if accessing API via hostname
我在 Owin 自托管 Web Api 上遇到 NTLM 身份验证问题。
服务器端和客户端都启用了 NTLM。在客户端我使用的是 RestSharp。
客户端
_client = new RestClient(ConfigurationManager.AppSettings["UserAccessApi"]);
_client.Timeout = 5000;
_client.Authenticator = new NtlmAuthenticator();
服务
var listener =
(System.Net.HttpListener)app.Properties["System.Net.HttpListener"];
listener.AuthenticationSchemes = System.Net.AuthenticationSchemes.IntegratedWindowsAuthentication;
app.UseWebApi(config);
如果我通过 IP 或 Chrome 浏览器访问此 API,它就可以正常工作,而如果通过主机名或 Internet Explorer 访问它,则不会。我认为这与使用 IE 引擎的 httpclient 的 restsharp 有关,我们公司有一些 local/public 网络安全设置,这些设置妨碍了 IE。任何人都有类似的问题并且知道如何在不采用 "Change IE settings" 方式的情况下克服它?
基于主机名的调用header
基于IP的调用header
Fiddler 日志,第一批 - 主机名调用,第二批 - ip
使用 AuthenticationSchemes.Ntlm 应该会有帮助。但这更像是一种解决方法,因为它将强制 Ntlm。
您可以通过使用缓存凭证强制 restsharp 使用 NTLM。
var url = ConfigurationManager.AppSettings["UserAccessApi"];
var credential = new CredentialCache
{
{
new Uri(url),
"NTLM",
new NetworkCredential(username, password)
}
};
_client = new RestClient(url)
{
Authenticator = new NtlmAuthenticator(credentials)
};
NetworkCredential
,这是 NTLM 的默认凭据,似乎不适用于这种情况。
我在 Owin 自托管 Web Api 上遇到 NTLM 身份验证问题。 服务器端和客户端都启用了 NTLM。在客户端我使用的是 RestSharp。
客户端
_client = new RestClient(ConfigurationManager.AppSettings["UserAccessApi"]);
_client.Timeout = 5000;
_client.Authenticator = new NtlmAuthenticator();
服务
var listener =
(System.Net.HttpListener)app.Properties["System.Net.HttpListener"];
listener.AuthenticationSchemes = System.Net.AuthenticationSchemes.IntegratedWindowsAuthentication;
app.UseWebApi(config);
如果我通过 IP 或 Chrome 浏览器访问此 API,它就可以正常工作,而如果通过主机名或 Internet Explorer 访问它,则不会。我认为这与使用 IE 引擎的 httpclient 的 restsharp 有关,我们公司有一些 local/public 网络安全设置,这些设置妨碍了 IE。任何人都有类似的问题并且知道如何在不采用 "Change IE settings" 方式的情况下克服它?
基于主机名的调用header
基于IP的调用header
Fiddler 日志,第一批 - 主机名调用,第二批 - ip
使用 AuthenticationSchemes.Ntlm 应该会有帮助。但这更像是一种解决方法,因为它将强制 Ntlm。
您可以通过使用缓存凭证强制 restsharp 使用 NTLM。
var url = ConfigurationManager.AppSettings["UserAccessApi"];
var credential = new CredentialCache
{
{
new Uri(url),
"NTLM",
new NetworkCredential(username, password)
}
};
_client = new RestClient(url)
{
Authenticator = new NtlmAuthenticator(credentials)
};
NetworkCredential
,这是 NTLM 的默认凭据,似乎不适用于这种情况。