我正在尝试调用一个Web API 2方法,该方法需要从我在我的桌面上运行的控制台应用程序进行身份验证,但我获得了401 Unathorized。我知道我有授权,因为当我从网络浏览器拨打同一个电话时,它工作正常。所以浏览器可以将我的默认登录ID / pw发送到API,但.NET的WebClient不能?这看起来很疯狂。必须有一种方法可以在不将我的id / pw输入控制台应用程序的情况下执行此操作。
以下是我在控制台应用中使用的内容,但它无效。
这是使用Windows Auth作为内联网的东西。
这会引发异常“远程服务器返回错误:(401)未经授权。”
using(var c = new WebClient())
{
c.UseDefaultCredentials = true;
string value = c.DownloadString("http://localhost:62659/api/Store/GetData");
}
我也尝试过以下操作,当我将鼠标悬停在DefaultNetworkCredentials上时,用户名/ pw是空白字符串。为什么.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);
}
答案 0 :(得分:2)
您可能没有在Windows Credential Manager内存储您的凭据信息。您可以通过Control Panel > Credential Manager
访问该内容。从那里你可以添加你需要的任何凭证。 CredentialCache.DefaultCredentials
和CredentialCache.DefaultNetworkCredentials
包含当前登录或模拟用户的登录凭据。如果您要连接的内容需要不同的凭据,那么这些将无效。您需要将这些凭据添加到Windows中的凭据管理器。
您在Chrome中正常连接的原因是Chrome会将凭据存储在您指定要保存的内容中。
用作功能ID的登录凭据可以设置为永不过期,或者需要将其添加到月/年维护项列表中以更新这些帐户的密码。
您还希望在应用程序中处理错误的登录信息。如果这是一项自动化任务,请通过电子邮件或以其他方式通知某人需要更新凭据。
如果用户运行此操作,您只需提示当前用户提供新密码,然后您可以使用该密码更新存储的凭据。
另一种选择是使用相同的凭据将用户设置为接收端的用户。这样,整个过程就与运行应用程序的用户相关联。
答案 1 :(得分:1)
使用DefaultCredentials应该可以在控制台应用程序中使用Windows Auth。只要您拥有web api正在寻找的相应授权标头。与我的评论相同我建议使用Postman测试api调用,以便您可以进行故障排除并检查您缺少的内容。
将凭据视为空白,这可能是因为您使用的是DefaultNetworkCredentials。
试试这个:
using(var c = new WebClient())
{
var uri = new Uri("http://localhost:62659/api/Store/GetData");
c.Credentials = System.Net.CredentialCache.DefaultCredentials;
string value = c.DownloadString(uri);
}
如果您想使用NetworkCredential,您应该输入网络凭据,如下所示:
c.Credentials = new NetworkCredential(username, password, domain);
我创建了这种类型的控制台应用程序并将其用作服务,我可以告诉你这应该可行。你应该只需要排除故障,逐位得到真正的问题。