Я использую следующий код в попытке программно разрешить учетной записи 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 из кода?