尝试在C#中设置KeyContainer的权限没有任何效果
发布时间:2020-12-15 04:34:27 所属栏目:百科 来源:网络整理
导读:我正在使用以下代码尝试以编程方式允许NetworkService帐户访问密钥: var RSA = new RSACryptoServiceProvider( new CspParameters() { KeyContainerName = "MyEncryptionKey",Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeySto
我正在使用以下代码尝试以编程方式允许NetworkService帐户访问密钥:
var RSA = new RSACryptoServiceProvider( new CspParameters() { KeyContainerName = "MyEncryptionKey",Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore }); RSA.CspKeyContainerInfo.CryptoKeySecurity.AddAccessRule( new System.Security.AccessControl.CryptoKeyAccessRule( new SecurityIdentifier(WellKnownSidType.NetworkServiceSid,null),CryptoKeyRights.GenericAll,AccessControlType.Allow ) ); 此代码运行时没有错误,但对密钥容器的权限没有影响. 但是,使用命令行工具aspnet_regiis做同样的事情,完美地工作: aspnet_regiis -pa "MyEncryptionKey" "NetworkService" 我正在运行完全管理员权限 – 如果我没有运行这些权限,则抛出异常.我也是最初创建密钥的用户. 密钥容器始终具有以下访问规则: S-1-5-18 -> LocalSystem S-1-5-32-544 -> Administrators S-1-5-5-0-135377 -> MyUser 使用aspnet_regiis,SID,S-1-5-20将添加到此列表中.我无法从代码中影响它. 我已经尝试以字符串格式从sid创建安全标识符,以及使用SetAccessRule而不是AddAccessRule. 任何想法如何从代码实际影响此ACL列表? 解决方法
您似乎没有调用Persist.您对CryptoKeySecurity所做的更改实际上并未立即保存.您需要使用其中一种Persist(…)方法来实际保存更改.
NativeObjectSecurity.Persist Method (String,AccessControlSections) 看起来这些API遵循一种相当复杂的修改方法.您需要首先创建CspParameters,应用必要的更改,然后从这些参数构造提供程序.构造调用容器的更新. var params = new CspParameters { KeyContainerName = "MyEncryptionKey",Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore }; params.CryptoKeySecurity.AddAccessRule( new System.Security.AccessControl.CryptoKeyAccessRule( new SecurityIdentifier(WellKnownSidType.NetworkServiceSid,AccessControlType.Allow ) ); var RSA = new RSACryptoServiceProvider(params); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |