c# - 使用默认凭据在控制台应用程序中调用 api

标签 c# .net asp.net-web-api2

我正在尝试调用 Web API 2 方法,该方法需要从我已授权的桌面上运行的控制台应用程序进行身份验证,但我收到 401 Unathorized。我知道我有授权,因为当我从网络浏览器进行相同的调用时,它工作正常。所以浏览器可以获得我的默认登录 id/pw 以发送到 API 但 .NET 的 WebClient 不能?这看起来很疯狂。必须有一种方法可以在不将我的 id/pw 输入到控制台应用程序的情况下执行此操作。

以下是我在控制台应用程序中使用的内容,但无法正常工作。

这是使用 Windows 身份验证,因为它是 Intranet 的东西。

这会引发异常“远程服务器返回错误:(401) 未经授权。”

using(var c = new WebClient())
{
    c.UseDefaultCredentials = true;   
    string value = c.DownloadString("http://localhost:62659/api/Store/GetData");
}

我还尝试了以下操作,当我将鼠标悬停在 DefaultNetworkCredentials 上时,用户名/密码为空字符串。为什么 .NET 不能解决这个问题?

using(var c = new WebClient())
            {
                var creds = new CredentialCache();
                var uri = new Uri("http://localhost:62659/api/Store/GetData");
                creds.Add(uri, "ntlm", System.Net.CredentialCache.DefaultNetworkCredentials);
                c.Credentials = creds;
                string value = c.DownloadString(uri);
            }

最佳答案

您的凭证信息很可能没有存储在 Windows Credential Manager 中.您可以通过 Control Panel > Credential Manager 访问它。从那里你可以添加你需要的任何凭证。 CredentialCache.DefaultCredentialsCredentialCache.DefaultNetworkCredentials 包含当前登录或模拟用户的登录凭据。如果您要连接的内容需要不同的凭据,那么这些将不起作用。您需要将这些凭据添加到 Windows 中的凭据管理器。

您在 Chrome 中连接良好的原因是 Chrome 会在您指定保存的凭据中存储自己。

用作功能 ID 的登录凭据可以设置为永不过期,或者需要将其添加到月度/年度维护项目列表中以更新这些帐户的密码。

您还希望在您的应用程序中处理错误的登录信息。如果这是一项自动化任务,请让它通过电子邮件或其他方式通知某人需要更新凭据。

如果用户运行此程序,您可以简单地提示当前用户提供一个新密码,您可以使用该密码立即更新存储的凭据。

另一种选择是将运行应用程序的用户设置为使用相同凭据的接收端用户。这样整个过程就与将运行应用程序的用户相关联。

关于c# - 使用默认凭据在控制台应用程序中调用 api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42978812/

相关文章:

c# - 无法在 SqlParameterCollection 上使用 FirstOrDefault

c# - (500) 内部服务器错误 - 使用 api 发送 Web 请求时

c# - .Net 应用程序内存管理

java - 如何使用 .NET 或 JAVA 创建具有数据类型的 XML 文档

c# - Web API 2 返回错误

c# - ASP.NET Web API StreamContent - 让浏览器显示下载进度

c# - MVC3 锁定成员(member)用户

c# - Unity 3D 中的程序地形编程

.net - ASP.NET 应用程序变量与从 ConfigurationSettings.AppSettings 读取

asp.net-web-api2 - ASP.NET Web API 多个 RoutePrefix