【问题标题】:Integrated Windows Authentication breaks File.Exists集成的 Windows 身份验证中断 File.Exists
【发布时间】:2013-12-14 11:58:39
【问题描述】:

我遇到了最奇怪的问题,我希望一些 ASP.NET 专家能给我一些关于发生了什么的线索。

我有一个在 IIS 6.0 上运行的 ASP.NET 网站。在它上面,我有一个 .asmx 网络服务。在 .asmx 网络服务中,我使用 System.IO.File.Exists() 检查网络共享上是否存在文件。该网站使用模拟。

这是一个巨大的问题:如果我将 IIS 设置为使用基本身份验证运行该站点,则 File.Exists 行将返回 True。如果我将其设置为集成 Windows 身份验证,它将返回 False。我没有改变其他任何东西,我可以来回改变并且完全相同的事情发生。我在调用File.Exists() 之前记录了一些信息,事实上,无论设置如何,User.Identity.NameSystem.Security.Principal.WindowsIdentity.GetCurrent().Name 都返回完全相同的名称(我自己的帐户显然可以访问我正在寻找的文件)。

我会发布我尝试过的东西,但老实说,在这种情况下你可以尝试什么,其中一个不应该影响问题的设置就是问题。我尝试关闭模拟,这也使 File.Exists() 调用返回 True(这让我大吃一惊,因为我自己的用户拥有比运行 appPool 的帐户更高的权限)。

有什么想法可以解决这个问题吗?

【问题讨论】:

    标签: c# asp.net iis windows-authentication basic-authentication


    【解决方案1】:

    好的,发生的事情是服务器无法委派身份验证。也就是说,它不能代表用户对另一台服务器进行操作,只能对自己进行操作。

    对于基本身份验证,委派不是问题,因为服务器知道您的密码(因为您将其作为基本身份验证的一部分告诉它),因此它可以对远程计算机执行身份验证。

    如果您处于 Active Directory/Kerberos 环境中,则必须将服务器配置为委派信任。我从来没有这样做过,所以我不确定到底是怎么做的,但这是配置问题,而不是编程问题。根据您的配置,您可能需要配置服务器计算机帐户或 IIS 身份或两者。

    这里有一些参考资料:

    如果您不是在 Kerberos 环境中,则必须使用基本身份验证,或者以其他方式从用户那里获取密码,然后自己调用 LogonUser 来模拟用户。如果使用基本身份验证或以任何其他方式使用明文密码,您当然必须使用 HTTPS/TLS 以确保安全。

    【讨论】:

    • 不幸的是,我无法设置这种委托,所以我们必须使用基本身份验证运行,这至少可以解决 File.Exists 问题。可悲的是,背景问题是我无法在另一台服务器(具有文件共享的同一台服务器)上调用 Web 服务,因为我得到 401 Unauthorized。不幸的是,基本身份验证并没有解决这个问题,即使它看起来也是一个委托问题。
    • 如果没有 Kerberos 委派,您无法将凭据传递给另一台 IIS 服务器。这就是 IIS 的限制,也就是所谓的双跳问题。
    • @tobberoth,您可以在基本身份验证会话中找到密码,因为它是会话变量之一。这应该使您能够建立与其他 Web 服务的显式基本身份验证连接。
    • @Ben 是的,这是我以前使用的解决方案,在两个站点都是基本身份验证的情况下,这是一个很好的解决方案。不过,关于我的问题的更新,我让它工作了,我唯一的猜测是,如果你从 SOURCE 上的 basic 转到 TARGET 上的 Integrated windows,.UseDefaultCredentials 就可以正常工作。基本到基本和诠释。窗户到诠释。 Windows 没有。
    猜你喜欢
    • 1970-01-01
    • 2011-10-08
    • 2010-12-08
    • 2019-01-31
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    相关资源
    最近更新 更多