Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列出用户具有读取权限的文件(ASP.NET)_C#_Asp.net_Security_Unauthorized_Windows Identity - Fatal编程技术网

C# 列出用户具有读取权限的文件(ASP.NET)

C# 列出用户具有读取权限的文件(ASP.NET),c#,asp.net,security,unauthorized,windows-identity,C#,Asp.net,Security,Unauthorized,Windows Identity,我想列出一个文件夹中用户具有读取权限的所有文件。用户访问网站,可以对网站的某些方面使用表单身份验证(例如添加链接等),但我想使用他们的Windows凭据列出给定文件夹中的文件(因为我已关闭匿名访问),隐藏他们无法读取的文件 但是,当使用Directory.GetFiles时,它还包括无法读取的文件(尽管元数据(文件大小、创建日期等)可以读取) 这就是我所拥有的: string[] files; string[] folders; string rootDir = @"\\server\path\

我想列出一个文件夹中用户具有读取权限的所有文件。用户访问网站,可以对网站的某些方面使用表单身份验证(例如添加链接等),但我想使用他们的Windows凭据列出给定文件夹中的文件(因为我已关闭匿名访问),隐藏他们无法读取的文件

但是,当使用
Directory.GetFiles
时,它还包括无法读取的文件(尽管元数据(文件大小、创建日期等)可以读取)

这就是我所拥有的:

string[] files;
string[] folders;
string rootDir = @"\\server\path\to\dir\";
WindowsIdentity id = (WindowsIdentity)User.Identity ;
using (System.Security.Principal.WindowsImpersonationContext context = System.Security.Principal.WindowsIdentity.Impersonate(id.Token))
{
        files = Directory.GetFiles(rootDir);
        folders = Directory.GetDirectories(rootDir);

        foreach (string file in files)
        {
            FileInfo fi = new FileInfo(file);
            FileSecurity fs = fi.GetAccessControl(AccessControlSections.Access);
            //foreach (FileSystemAccessRule rule in fs.GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier)))
            //{
            //  Response.Write((FileSystemRights.Read & rule.FileSystemRights) + " <br />");
            //}

            Response.Write(file + " " + fi.Length + "<br />");
        }
        context.Undo();
}

您知道如何做到这一点,而不必尝试打开每个文件并捕获发生的异常吗?

您可能需要在asp.net/IIS中设置Windows/Integrated Authentication

设法修复了它。当您拒绝读取文件时,它也会拒绝读取权限,因此出现
UnauthorizedAccessException
。所以使用
试试。。。catch…
看起来它是唯一的选项

如果拒绝读取并且允许读取权限(在高级设置下完成),则可以防止异常。这将处理以下两个方面:

string[] files;
string[] folders;
WindowsIdentity id = (WindowsIdentity)User.Identity;
using (System.Security.Principal.WindowsImpersonationContext context = id.Impersonate())
{
    files = Directory.GetFiles(RootDir);
    folders = Directory.GetDirectories(RootDir);

    foreach (string file in files)
    {
        FileInfo fi = new FileInfo(file);
        FileSecurity fs = null;
        try
        {
            fs = fi.GetAccessControl(AccessControlSections.Access);
        }
        catch (UnauthorizedAccessException)
        {
            goto Next;
        }
        foreach (FileSystemAccessRule rule in fs.GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier)))
        {
            if (id.User.CompareTo(rule.IdentityReference as SecurityIdentifier) == 0)
            {
                if(rule.AccessControlType.ToString() == "Deny" &&
                    rule.FileSystemRights.ToString().Contains("ReadData"))
                {
                    goto Next;
                }
            }
        }

        Response.Write(file + " " + fi.Length + "<br />");
        // next in sequence. label for goto
        Next: ;
    }
    context.Undo();
}
string[]文件;
字符串[]文件夹;
WindowsIdentity id=(WindowsIdentity)User.Identity;
使用(System.Security.Principal.WindowsImpersonationContext=id.Impersonate())
{
files=Directory.GetFiles(RootDir);
folders=Directory.GetDirectories(RootDir);
foreach(文件中的字符串文件)
{
FileInfo fi=新的FileInfo(文件);
文件安全性fs=null;
尝试
{
fs=fi.GetAccessControl(AccessControlSections.Access);
}
捕获(未经授权的访问例外)
{
转到下一个;
}
foreach(fs.GetAccessRules中的FileSystemAccessRule规则(true、true、typeof(System.Security.Principal.SecurityIdentifier)))
{
if(id.User.CompareTo(rule.IdentityReference as SecurityIdentifier)==0)
{
if(rule.AccessControlType.ToString()=“拒绝”&&
rule.FileSystemRights.ToString()包含(“ReadData”))
{
转到下一个;
}
}
}
Response.Write(文件+“”+fi.Length+“
”; //序列中的下一个。转到的标签 下一个:; } context.Undo(); }

现在,文件可以在任何目录中列出(使用模拟),而无需给予ASP.NET帐户(通常是网络服务)访问权限。

该站点使用集成身份验证,并且它可以检索文件列表的事实表明情况就是这样(否则会出现异常-与我得到的异常不同)。尝试获取文件的访问规则时出错。我讨厌挑剔。。。但是你为什么要用goto和标签呢?根据需要中断或继续。已尝试中断,但只会中断FileAccessRule foreach。。想要突破它并继续下一个文件。虽然我想可能会用一个bool。。。标签不好用吗?如果是,为什么不好?Goto非常适合打破嵌套循环。它通过在每个循环级别避免不必要的条件中断,简化了逻辑并在许多情况下提高了性能。
string[] files;
string[] folders;
WindowsIdentity id = (WindowsIdentity)User.Identity;
using (System.Security.Principal.WindowsImpersonationContext context = id.Impersonate())
{
    files = Directory.GetFiles(RootDir);
    folders = Directory.GetDirectories(RootDir);

    foreach (string file in files)
    {
        FileInfo fi = new FileInfo(file);
        FileSecurity fs = null;
        try
        {
            fs = fi.GetAccessControl(AccessControlSections.Access);
        }
        catch (UnauthorizedAccessException)
        {
            goto Next;
        }
        foreach (FileSystemAccessRule rule in fs.GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier)))
        {
            if (id.User.CompareTo(rule.IdentityReference as SecurityIdentifier) == 0)
            {
                if(rule.AccessControlType.ToString() == "Deny" &&
                    rule.FileSystemRights.ToString().Contains("ReadData"))
                {
                    goto Next;
                }
            }
        }

        Response.Write(file + " " + fi.Length + "<br />");
        // next in sequence. label for goto
        Next: ;
    }
    context.Undo();
}