c#Web Api:本地主机上的 HTTP 200 但远程主机上的 400/401 具有相同的用户

Posted

技术标签:

【中文标题】c#Web Api:本地主机上的 HTTP 200 但远程主机上的 400/401 具有相同的用户【英文标题】:c# WebApi: HTTP 200 on local host but 400/401 on remote host with same user 【发布时间】:2019-01-14 05:32:36 【问题描述】:

我编写了一个简单的 WebAPI 服务(在 Windows 服务中由 OWIN 托管)并将 [Authorize] 属性放在 POST 方法上。据我了解,现在只有“已知”用户才能访问该服务(别担心,我知道,所有已知用户还不是很安全)。

到目前为止,我的测试客户端工作正常当主机和客户端位于同一台机器上时(例如我的工作站)。但是,当我在服务器计算机上部署服务并再次尝试调用服务时,在使用 System.Net.Http.HttpClient 并设置 httpClientHandler.UseDefaultCredentials=true 时出现 HTTP 400 失败,或者在使用时出现 HTTP 401 System.Net.WebClient 并设置 webClient.UseDefaultCredentials=True。

因此,根据服务是本地托管还是远程托管,身份验证机制的作用似乎有所不同。

出于测试原因,我还尝试使用用户和密码显式设置凭据,但结果完全相同。

但是,我在这里错过了什么?有什么建议? 提前谢谢!

【问题讨论】:

【参考方案1】:

验证机器密钥。

如果授权服务器和资源服务器不在同一台计算机上,OAuth 中间件将使用不同的机器密钥对承载访问令牌进行加密和解密。为了在两个项目之间共享相同的私钥,我们在两个 web.config 文件中添加了相同的 machinekey 设置。

https://docs.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server

【讨论】:

真的!我在 HttpListener 上使用了 AuthenticationSchemes.IntegratedWindowsAuthentication,我误解了文档。我想当 Negotiate fails 时,会使用 NTLM。但实际上它的意思是,当 Negotiate 不支持 时,将使用 NTLM。谢谢!

以上是关于c#Web Api:本地主机上的 HTTP 200 但远程主机上的 400/401 具有相同的用户的主要内容,如果未能解决你的问题,请参考以下文章

无法访问本地主机上的 API 资源管理器

错误请求 - 从跨 LAN 访问本地主机 Web API 或 Web 应用程序时主机名无效

本地主机上的 Apache Tomcat websockets 实现

Dart/flutter:如何在模拟器的本地主机上显示来自 API 的图像

C#.NET 4.0 - HttpWebRequest.GetRepsonse() 无法访问 Web 服务

API调用代码在本地主机上工作但不在服务器上