我使用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现在看起来像:
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
如果您不想使用DataProtectionScope.CurrentUser
,您可以将其作为LocalMachine
安装。然后,让WebService
解密它,然后使用CurrentUser
对重新加密。确保删除旧值及其所有临时副本。通过这种方式,您可以将它从LocalMachine
中取出,并在适当的用户运行时将其锁定。
这仍然使密钥暴露在LocalMachine
级别,但时间更短。
另一个解决方案是使用LocalMachine
并使用附加的熵特性,在两个可执行文件之间共享一个秘密。这可能是应用程序已知的一个模糊值(no "real"安全性),或者用户提供的密码。用户提供的密码解决方案可能更安全,但也更麻烦,编程开销也更大。
如果安装和运行WebService
之间的时间窗口很小,那么第一个解决方案可能比较合适。
问题解决了。
从本地用户运行IIS应用程序。
你可以通过选择应用程序池并点击高级设置来找到它。在操作窗格菜单下。选择Identity,然后单击所列当前用户旁边的按钮。选择"自定义帐户",单击"设置"。使用格式domainusername作为用户名,并输入用户密码。