.NET 中的数据分类

数据分类可帮助你根据其敏感度和保护级别对数据进行分类(或分类)。 通过结构 DataClassification ,可以标记敏感信息并基于这些标签强制实施策略。

在某些情况下,您可能需要明确指定数据没有任何数据分类,这可以通过使用 DataClassification.None 来实现。 同样,可能需要指定数据分类未知-在这些情况下使用 DataClassification.Unknown

安装软件包

若要开始,请安装 📦 Microsoft.Extensions.Compliance.Abstractions NuGet 包:

dotnet add package Microsoft.Extensions.Compliance.Abstractions

或者,如果使用的是 .NET 10+ SDK:

dotnet package add Microsoft.Extensions.Compliance.Abstractions

创建自定义分类

通过为不同类型的敏感数据创建 static 成员来定义自定义分类。 这为你提供了一种一致的方式来标记和处理应用中的数据。 请考虑以下示例类:

using Microsoft.Extensions.Compliance.Classification;

internal static class MyTaxonomyClassifications
{
    internal static string Name => "MyTaxonomy";

    internal static DataClassification PrivateInformation => new(Name, nameof(PrivateInformation));
    internal static DataClassification CreditCardNumber => new(Name, nameof(CreditCardNumber));
    internal static DataClassification SocialSecurityNumber => new(Name, nameof(SocialSecurityNumber));

    internal static DataClassificationSet PrivateAndSocialSet => new(PrivateInformation, SocialSecurityNumber);
}

如果要与其他应用共享自定义分类分类,此类及其成员应 public 不是 internal。 例如,你可以有一个包含自定义分类的共享库,可以在多个应用程序中使用。

DataClassificationSet 允许将多个数据分类组合到单个集中。 这样就可以使用多个数据分类对数据进行分类。 此外,.NET 编辑 API 使用 DataClassificationSet.

注释

将多个数据分类组合在一起作为 DataClassificationSet 时,视为一个单一分类。 可以将它视为逻辑 AND 操作。 例如,如果为分类为DataClassificationSetPrivateInformationSocialSecurityNumber的数据配置了编辑功能,则它不适用于仅为PrivateInformationSocialSecurityNumber分类的数据。

创建自定义分类属性

基于自定义分类创建自定义属性。 使用这些属性为您的数据标记正确的分类。 请考虑以下自定义属性类定义:

public sealed class PrivateInformationAttribute : DataClassificationAttribute
{
    public PrivateInformationAttribute()
        : base(MyTaxonomyClassifications.PrivateInformation)
    {
    }
}

前面的代码声明一个私有信息属性,该属性是类型的子类 DataClassificationAttribute 。 它定义无参数构造函数并将自定义 DataClassification 传递给其 base

绑定数据分类设置

若要绑定数据分类设置,请使用 .NET 配置系统。 例如,假设你使用的是 JSON 配置提供程序,则可以定义 appsettings.json ,如下所示:

{
    "Key": {
        "PhoneNumber": "MyTaxonomy:PrivateInformation",
        "ExampleDictionary": {
            "CreditCard": "MyTaxonomy:CreditCardNumber",
            "SSN": "MyTaxonomy:SocialSecurityNumber"
        }
    }
}

现在,请考虑以下选项模式方法,该方法将这些配置设置 TestOptions 绑定到对象中:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Compliance.Classification;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;

public class TestOptions
{
    public DataClassification? PhoneNumber { get; set; }
    public IDictionary<string, DataClassification> ExampleDictionary { get; set; } = new Dictionary<string, DataClassification>();
}

class Program
{
    static void Main(string[] args)
    {
        // Build configuration from an external json file.
        IConfiguration configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .Build();

        // Setup DI container and bind the configuration section "Key" to TestOptions.
        IServiceCollection services = new ServiceCollection();
        services.Configure<TestOptions>(configuration.GetSection("Key"));

        // Build the service provider.
        IServiceProvider serviceProvider = services.BuildServiceProvider();

        // Get the bound options.
        TestOptions options = serviceProvider.GetRequiredService<IOptions<TestOptions>>().Value;

        // Simple output demonstrating binding results.
        Console.WriteLine("Configuration bound to TestOptions:");
        Console.WriteLine($"PhoneNumber: {options.PhoneNumber}");
        foreach (var item in options.ExampleDictionary)
        {
            Console.WriteLine($"{item.Key}: {item.Value}");
        }
    }
}