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

C# 在控制台应用程序中使用默认凭据调用api,c#,.net,asp.net-web-api2,C#,.net,Asp.net Web Api2,我正在尝试调用一个WebAPI2方法,该方法需要在我有授权的桌面上运行的控制台应用程序中进行身份验证,但我得到了401未授权。我知道我有授权,因为当我从网络浏览器打同一个电话时,它工作正常。所以浏览器可以获取我的默认登录id/pw以发送到API,但是.NET的WebClient不能?这似乎很疯狂。必须有一种方法可以做到这一点,而无需在控制台应用程序中输入我的id/pw 下面是我在一个控制台应用程序中使用的,但它不起作用 这是使用Windows Auth作为内部网的内容 这引发异常“远程服务器返回

我正在尝试调用一个WebAPI2方法,该方法需要在我有授权的桌面上运行的控制台应用程序中进行身份验证,但我得到了401未授权。我知道我有授权,因为当我从网络浏览器打同一个电话时,它工作正常。所以浏览器可以获取我的默认登录id/pw以发送到API,但是.NET的WebClient不能?这似乎很疯狂。必须有一种方法可以做到这一点,而无需在控制台应用程序中输入我的id/pw

下面是我在一个控制台应用程序中使用的,但它不起作用

这是使用Windows Auth作为内部网的内容

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

我还尝试了以下方法,当我将鼠标悬停在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);
            }

您的凭证信息可能未存储在中。您可以通过
控制面板>凭证管理器
访问该功能。从那里你可以添加你需要的任何凭证
CredentialCache.DefaultCredentials
CredentialCache.DefaultNetworkCredentials
包含当前登录或模拟用户的登录凭据。如果您要连接的内容需要不同的凭据,则这些凭据将不起作用。您需要将这些凭据添加到Windows中的凭据管理器中

在Chrome中连接良好的原因是Chrome将在其自身中存储您指定要保存的凭据

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

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

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


另一个选项是使用相同的凭据将运行应用程序的用户设置为接收端的用户。这样,整个流程都与将运行应用程序的用户绑定

使用DefaultCredentials应该可以从控制台应用程序使用Windows身份验证。只要您拥有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);

我创建了这种类型的控制台应用程序,并将其作为服务使用,我可以告诉您,这应该是可行的。您应该只需要进行故障排除,然后一点一点地找出真正的问题。

您是否收到了异常或任何可以共享的错误信息?Fiddler2将向您显示与get请求一起传递的凭据。我使用它来排除这类问题。您是否能够查看凭据信息并将其与两个不同的电话,同时监测您的网络流量?那么是评论告诉我这应该工作,它的工作为其他人?这是一个大麻烦。在从批处理服务器运行应用程序的公司设置中,管理员在更改批处理id/pw(在调度系统中进行作业时,我们不知道批处理id/pw)时不会希望维护此设置。大扫兴。@user441521-我在看到你上面的评论后提到了一点。另一种方法是将其写入应用程序。如果凭据由于错误的登录信息而失败,您可以让它通过电子邮件发送,或以其他方式通知某人凭据需要更新。@user441521-我已将我的答案扩展到,提供一些替代方法。@user441521-这些方法对回答您的问题有帮助吗?这将从调度系统调用,因此管理员只维护一个用户。我不认为这有什么关系。我很可能会创建一个控制台应用程序,使用Windows Auth直接访问数据库,并让它执行与API相同的sql操作。NetworkCredential和DefaultCredentials之间有什么区别?我的意思是我的ID,我想是默认的凭据,是网络上的一个广告ID。遗憾的是,这个地方不允许我当邮递员。试着拉小提琴,但没看到交通堵塞,但我不怎么用小提琴,所以可能是我。尝试您的Web API是Web API 2,在控制器上带有Authorize标记,并使用Windows身份验证?当它来自控制台应用程序时,Fiddler似乎不会显示它。@user441521-
DefaultNetworkCredentials
的类型为
NetworkCredential
,它是实际使用的类
DefaultCredentials
返回类型为:
ICredentials
的对象,但是
DefaultCredentials
上的
GetCredentials()
函数返回类型为
NetworkCredentials
的对象。无论您使用哪一个,您实际上都在使用实现
ICredentials
界面的
NetworkCredential
实例。是的,我正在使用Windows Auth使用Web API2。不是100%确定我在fiddler中查找的内容,但如果我将.fiddler添加到url中,它就能够显示出来。当我查看cookies/login下的标题时,我看到:代理支持:基于会话的身份验证、WWW-Authenticate:Negotiate、WWW-Authenticate:NTLM。当我在headers->Cookies/Login下查看来自web浏览器的请求时,它会显示:Persistent Auth:true
c.Credentials = new NetworkCredential(username, password, domain);