来自不同用户的DPAPI ProtectData

时间:2016-08-30 07:59:39

标签: c# web-services iis data-protection dpapi

我使用DPAPI ProtectData如下:

var temp = new byte[32]
{
    1,1,1,1,1,1,1,1,
    2,2,2,2,2,2,2,3,
    3,3,3,3,3,3,3,3,
    4,4,4,4,4,4,4,4
};

ProtectedData.Protect(temp, null, DataProtectionScope.CurrentUser);
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

让我们假设现在临时看起来像:

temp = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,....31 };

我想从.exe文件以及我的WebService(IIS)执行此代码 问题是,如果我从exe运行代码,则当前用户为MyDomain/Administrator,如果我从WebService运行代码,则当前用户为IIS APPPOOL/MyApp

我该如何解决这个问题? 我试图从WebService .exe文件运行如下:

Process.Start(@"C:\myexe.exe");

但是由于某种原因它没有用(我可以完全访问我的iis应用程序),无论如何我不认为这是这种情况的正确解决方案。

注意:出于安全原因,我无法从DataProtectionScope.LocalMachine更改为DataProtectionScope.CurrentUser

2 个答案:

答案 0 :(得分:2)

如果您不想使用DataProtecitonScope.LocalMachine,可以先将其安装为LocalMachine。然后,让WebService解密它,然后使用CurrentUser 重新加密它。确保删除旧值。通过这种方式,您可以从LocalMachine获取它,并在适当的用户运行后将其锁定。

这仍然会使密钥在LocalMachine级别暴露一段时间。

另一个解决方案是使用LocalMachine并使用额外的熵功能和两个可执行文件之间共享的秘密。这可能是应用程序已知的模糊值(没有"真正的"安全性),或者是用户提供的密码。用户提供的密码解决方案可能更安全,但也更多的是痛苦和更多的编程开销。

如果安装和WebService运行之间的差距很小,那么第一个解决方案可能非常合适。

答案 1 :(得分:0)

问题解决了。
我从本地用户运行IIS应用程序 您可以通过选择应用程序池并单击“操作”窗格菜单下的“高级设置...”来找到此选项。选择“身份”,然后单击列出的当前用户旁边的按钮。选择自定义帐户,然后单击设置使用格式domain \ username作为用户名并输入用户的密码。