我正在尝试调用 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.DefaultCredentials
和 CredentialCache.DefaultNetworkCredentials
包含当前登录或模拟用户的登录凭据。如果您要连接的内容需要不同的凭据,那么这些将不起作用。您需要将这些凭据添加到 Windows 中的凭据管理器。
您在 Chrome 中连接良好的原因是 Chrome 会在您指定保存的凭据中存储自己。
用作功能 ID 的登录凭据可以设置为永不过期,或者需要将其添加到月度/年度维护项目列表中以更新这些帐户的密码。
您还希望在您的应用程序中处理错误的登录信息。如果这是一项自动化任务,请让它通过电子邮件或其他方式通知某人需要更新凭据。
如果用户运行此程序,您可以简单地提示当前用户提供一个新密码,您可以使用该密码立即更新存储的凭据。
另一种选择是将运行应用程序的用户设置为使用相同凭据的接收端用户。这样整个过程就与将运行应用程序的用户相关联。
关于c# - 使用默认凭据在控制台应用程序中调用 api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42978812/