【问题标题】:Support for File Security in .NET Core.NET Core 中的文件安全支持
【发布时间】:2017-05-25 21:26:01
【问题描述】:

我们将 .NET 4.0 类库移植到 .NET Core 1.1 时遇到了 .NET Core CLR 中对文件安全性和权限的支持非常有限的问题。

我们试图将访问控制权限设置为如下文件,并且 FileInfo 似乎不再具有任何 SetAccessControl 或 GetAccessControl。

 // Get a FileSecurity object that represents the
    // current security settings.
    FileSecurity fSecurity = File.GetAccessControl(fileName);

    // Add the FileSystemAccessRule to the security settings.
    fSecurity.AddAccessRule(new FileSystemAccessRule(account,
        rights, controlType));

    // Set the new access settings.
    File.SetAccessControl(fileName, fSecurity);

目标只是为文件的当前所有者添加执行权。

【问题讨论】:

    标签: file security .net-core


    【解决方案1】:

    由于使用率低且特定于 Windows,这些 API 未包含在 .NET Standard 中。

    请参阅此处有关将其从 .NET Standard 中排除的讨论:https://github.com/dotnet/standard/issues/15

    作为一种解决方法,有一个提供此功能的 NuGet 包:https://www.nuget.org/packages/System.IO.FileSystem.AccessControl/

    还有一个相关问题:How to modify file access control in .NET Core

    【讨论】:

      【解决方案2】:

      在 dotnet 标准/核心中:

      以提到的用户 bvpb 的身份导入 NuGet 包。 System.IO.FileSystem.AccessControl

      然后代替这个(仅适用于 .NET Framework):

      FileSecurity fSecurity = File.GetAccessControl(fileName);
      

      使用它(适用于所有版本的 .NET):

      FileSecurity fSecurity = new FileSecurity(fileName, AccessControlSections.Owner | 
                      AccessControlSections.Group |
                      AccessControlSections.Access);
      

      您可能需要AccessControllSections.All,而这需要运行此代码的帐户拥有更多权限。

      【讨论】:

        【解决方案3】:

        哇,那里有这么多信息,尽管文档说在 .NET Core 3.1 中不能执行 DirectoryInfo.SetAccessRule,但它已编译并工作!

        更新:啊哈!文档说这是受支持的并且可以工作。 https://docs.microsoft.com/en-us/dotnet/api/system.io.filesystemaclextensions?view=dotnet-plat-ext-3.1 有一个 SetAccessControl 方法

        请务必添加System.IO.FileSystem.AccessControl NuGet 包。

        这是我在 .NET Framework 中的内容:

        var ds = new DirectorySecurity();
        ds.AddAccessRule(new FileSystemAccessRule(adminSI, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
        ds.SetAccessRuleProtection(true, false); // disable inheritance and clear any inherited permissions
        
        Directory.SetAccessControl(<path to directory>, ds);
        

        这就是它在 .NET Core 3.1 中的作用。只有最后一行不同:

        var ds = new DirectorySecurity();
        ds.AddAccessRule(new FileSystemAccessRule(adminSI, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
        ds.SetAccessRuleProtection(true, false); // disable inheritance and clear any inherited permissions
        
        System.IO.FileSystemAclExtensions.SetAccessControl(new DirectoryInfo(<path to directory>), ds);
        

        【讨论】:

          猜你喜欢
          • 2022-10-19
          • 1970-01-01
          • 2017-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-11
          相关资源
          最近更新 更多