(内部网)我正在尝试建立一个网站,该网站将提供来自网络共享的文件(\\服务器名\文件夹\文件)。只有可以通过活动目录组访问网络文件夹的用户才能通过网站下载文件。
站点:
AppPool:DefaultAppPool
身份验证:Windows身份验证
子站点:
AppPool:DefaultAppPool
身份验证:Windows身份验证
虚拟目录:
物理路径:\\服务器名\文件夹
物理路径凭证:应用程序用户(通过身份验证)
登录类型:ClearText
当我尝试使用诸如http://webserver/subsite/virtualdirectory/folder/file.xls这样的链接导航到该站点时,即使输入的凭据应该有效,我也会反复提示输入凭据。在虚拟目录设置中,如果我将其从传递更改为“特定用户”,则它可以工作,但是绕过了活动目录组的安全性。
我在这里配置不正确吗?
答案 0 :(得分:1)
正在进行两种独立的身份验证:
这些是完全独立的操作。
您说您正在为用户使用Windows身份验证。但是IIS仍将使用应用程序池标识来对其正在服务的实际文件进行身份验证(这就是“传递”的含义-它“传递”应用程序池凭据),除非您在虚拟配置中指定了不同的凭据如您所见。
您可以在子站点上启用ASP.NET模拟-毕竟,模拟的整个目的是使您可以像登录的用户那样做站点-但是您会遇到double hop problem:您可以使用用户的凭据在服务器上进行身份验证,但是(默认情况下)不能将这些凭据发送到另一台服务器。为此,您需要在Active Directory(can get complicated)中设置Kerberos委派。
如果不能选择设置委派,那么您将不得不寻找另一种方式来将这些文件提供给用户。
如果您确实希望共享的共享权限决定谁可以通过该网站下载文件,我同意这是一个很难解决的问题。一种选择是直接链接到共享(如果用户的计算机可以通过网络访问服务器):
<a href="file://servername/Folder/somefile.txt">Download</a>
这在IE中有效,但不适用于Chrome,因为Chrome专门禁用file://链接(除非您通过plugin启用了该链接)。
另一个更复杂的选择是通过应用程序通过管道传输文件。您的应用程序可以访问文件并枚举共享权限,以查看用户是否具有访问权限,然后允许下载。但是众所周知,NTFS权限很难通过。
或者只是忽略共享权限,然后找到其他方法来确定此人是否应该具有访问权限(例如,一个特定的安全组),而不是依赖共享权限。
答案 1 :(得分:0)
恐怕指定用户是实现此目的的唯一方法。
我建立了一个共享文件夹,例如\\ server \ shared。 监视NTLM身份验证时,我还注意到,如果我将用户指定为直通,则IIS将尝试使用大写\\ SERVER \ SHARED访问Path并拒绝访问。
但是,如果我指定身份验证用户,则NTLM可以正常工作,并且工作进程将不会执行相同的操作。我还注意到工作和不工作操作的用户身份是相同的。
我在工作站和域环境中都尝试过。但是,NTLM和Kerberos的结果相同。因此,我认为您可能需要接受特定用户作为解决方法。