【问题标题】:Why does CredentialCache.DefaultCredential contain empty strings for domain, username, and password为什么 CredentialCache.DefaultCredential 包含域、用户名和密码的空字符串
【发布时间】:2011-10-02 18:55:01
【问题描述】:

有没有人知道为什么 CredentialCache.DefaultCredential 会返回一个 ICredential 实例,其中域、用户名和密码为空字符串?我在 IIS 7.5 上运行 WCF 服务。它在一台服务器上运行良好,但在另一台服务器上无法运行。我已验证 IIS 应用程序已启用 Windows 身份验证....

这是它的使用方法:

string url = string.Format("{0}/departments/finance/_vti_bin/listdata.svc", _IntranetAddress);
var financeDataContext = new FinanceDataContext(new Uri(url))
{
    Credentials = CredentialCache.DefaultCredentials
};

【问题讨论】:

    标签: iis networkcredentials


    【解决方案1】:

    我不确定它在您的一台服务器上是如何工作的?我希望你已经读过这个 http://msdn.microsoft.com/en-us/library/system.net.credentialcache.defaultcredentials.aspx 但它明确表示“DefaultCredentials 返回的 ICredentials 实例不能用于查看当前安全上下文的用户名、密码或域。”

    【讨论】:

    • 这很有趣。我绝对可以在其他环境中看到域和用户名。我会读一读,看看有没有什么弹出来。
    【解决方案2】:

    从 CredentialCache.DefaultCredential 返回的 NetworkCredential 只是一个占位符。如果您使用调试器查看它,您会发现它的类型为 SystemNetworkCredential。内部 API 检查此类型以查看是否应使用集成身份验证。还有其他方法可以获取当前用户名(如 WindowsIdentity.GetCurrent())。

    编辑: 要为 WCF 操作指定模拟,请将此属性添加到实现协定的方法中:

    [OperationBehavior(Impersonation = ImpersonationOption.Required)]
    public void SomeMethod() 
    {
        // do something here
    }
    

    【讨论】:

    • 我想我应该一开始就指定它,但我需要将凭据传递给 sharepoint 以执行服务操作。我不只是想获得用户名。
    • 好吧,然后继续使用 DefaultCredentials 处理您的 SharePoint 请求。这应该没有问题。您可能遇到的问题是您没有在 WCF 服务上启用模拟。请参阅我关于如何执行此操作的答案。如果您的 WCF 服务和 Sharepoint 服务器位于不同的服务器上,则需要配置 Kerberos,因为 NTLM 不支持凭据委派。
    • 我真的不使用冒充。我期望从 CredentialCache.DefaultCredential 获得的凭据是应用程序池的标识(我已经验证它是正确的)。
    • 问题在于 CredentialCache.DefaultCredential 返回的凭据为空域和用户名,而不是预期的应用程序池标识。
    • 所以事实证明有人玩弄了 IIS 设置并更改了应用程序池标识。这就是为什么我们不让每个人和他们的祖母上服务器的原因!谢谢你们的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多