使用默认凭据在控制台应用

时间:2017-03-23 14:22:37

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

我正在尝试调用一个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);
            }

2 个答案:

答案 0 :(得分:2)

您可能没有在Windows Credential Manager内存储您的凭据信息。您可以通过Control Panel > Credential Manager访问该内容。从那里你可以添加你需要的任何凭证。 CredentialCache.DefaultCredentialsCredentialCache.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);

我创建了这种类型的控制台应用程序并将其用作服务,我可以告诉你这应该可行。你应该只需要排除故障,逐位得到真正的问题。