在测试项目中使用 IDataProtectionProvider?

Mar*_*cus 8 c# encryption integration-testing .net-core asp.net-core

IDataProtectionProvider在 Web API 中使用时,IoC 容器使用AddDataProtection( services.AddDataProtection();) 进行配置,并允许使用 DI 来检索IDataProtectionProvider服务中的 a:

private readonly IDataProtectionProvider _dataProtectionProvider;

public CipherService(IDataProtectionProvider dataProtectionProvider)
{
    _dataProtectionProvider = dataProtectionProvider;
}
Run Code Online (Sandbox Code Playgroud)

如果我想测试我的CipherService(在我的情况下使用 Xunit),如果不使用 DI,我将无法完成这项工作,所以我的问题是;

问:如何IDataProtectionProvider在测试项目中使用 DI 或其他方式制作?

Art*_*tak 9

这是我如何使用 Moq 框架做到的:

Mock<IDataProtector> mockDataProtector = new Mock<IDataProtector>();
mockDataProtector.Setup(sut => sut.Protect(It.IsAny<byte[]>())).Returns(Encoding.UTF8.GetBytes("protectedText"));
mockDataProtector.Setup(sut => sut.Unprotect(It.IsAny<byte[]>())).Returns(Encoding.UTF8.GetBytes("originalText"));

Mock<IDataProtectionProvider> mockDataProtectionProvider = new Mock<IDataProtectionProvider>();
mockDataProtectionProvider.Setup(s => s.CreateProtector(It.IsAny<string>())).Returns(mockDataProtector.Object);
Run Code Online (Sandbox Code Playgroud)

在我需要传入 IDataProtectionProvider 的地方,我使用:

mockDataProtectionProvider.Object
Run Code Online (Sandbox Code Playgroud)

对于需要真正 DataProtectionProvider 的集成测试场景,您可以使用以下MSDN 文档文章。

希望这可以帮助。

  • 如果您使用采用字符串而不是字节数组的扩展 Protect 方法,它不起作用,您知道吗? (2认同)

Mat*_*hew 8

EphemeralDataProtectionProvider可用于单元测试场景,因为它为每个实例生成一个随机秘密。

例子:

var dataProtectionProvider = new EphemeralDataProtectionProvider();

var service = new CipherService(dataProtectionProvider);

// test as usual
Run Code Online (Sandbox Code Playgroud)

这是 Microsoft 专门为您的确切用例提供的。

在某些情况下,应用程序需要一次性 IDataProtectionProvider。例如,开发人员可能只是在一次性控制台应用程序中进行试验,或者应用程序本身是瞬态的(它是脚本化的或单元测试项目)。为了支持这些方案,Microsoft.AspNetCore.DataProtection 包包含一个类型 EphemeralDataProtectionProvider。此类型提供 IDataProtectionProvider 的基本实现,其密钥存储库仅保存在内存中,不会写出到任何后备存储。

  • 我相信这应该是公认的答案,因为它提供了一种在测试的“安排/准备”阶段保护/取消保护数据的方法,然后在测试本身中应用/测试相反的操作。不管怎样,谢谢你的帮助! (2认同)