代码之家  ›  专栏  ›  技术社区  ›  Jim T

尝试在C#中设置密钥容器的权限无效

  •  7
  • Jim T  · 技术社区  · 14 年前

    我使用以下代码试图通过编程方式允许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 -pa "MyEncryptionKey" "NetworkService"
    

    密钥容器始终具有以下访问规则:

    S-1-5-18         -> LocalSystem
    S-1-5-32-544     -> Administrators
    S-1-5-5-0-135377 -> MyUser
    

    使用aspnet\u regiis,SID,S-1-5-20被添加到此列表中。我不能从代码上影响它。

    我尝试过以字符串格式从sid创建安全标识符,以及使用SetAccessRule而不是AddAccessRule。

    你知道如何从代码中影响这个ACL列表吗?

    2 回复  |  直到 14 年前
        1
  •  10
  •   jrista    14 年前

    Persist(...) 方法来实际保存更改。

    NativeObjectSecurity.Persist Method (String, AccessControlSections)

    var params = new CspParameters
    {
         KeyContainerName = "MyEncryptionKey", 
         Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore    
    };
    
    params.CryptoKeySecurity.AddAccessRule(
      new System.Security.AccessControl.CryptoKeyAccessRule(
        new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null),
        CryptoKeyRights.GenericAll,
        AccessControlType.Allow
      )
    );
    
    var RSA = new RSACryptoServiceProvider(params);
    
        2
  •  1
  •   T Brown    6 年前

    我只是想把Jim T在评论中所说的正式化,因为它对我有用。

    //Read the current settings
    CspParameters csp = new CspParameters(PROVIDER_RSA_FULL)
    {
        KeyContainerName = container,
        Flags = CspProviderFlags.NoPrompt | CspProviderFlags.UseMachineKeyStore | CspProviderFlags.UseExistingKey
    };
    //Retrieve Current Settings
    using (var rsa = new RSACryptoServiceProvider(csp))
    {
        var ci = rsa.CspKeyContainerInfo;
    
        //Create new settings and copy values over
        CspParameters csp2 = new CspParameters(PROVIDER_RSA_FULL)
        {
            KeyContainerName = container,
            Flags = CspProviderFlags.NoPrompt | CspProviderFlags.UseMachineKeyStore | CspProviderFlags.UseExistingKey,
            CryptoKeySecurity = ci.CryptoKeySecurity,
            ProviderName = ci.ProviderName,
            ProviderType = ci.ProviderType
        };
        //Add Permissions
        csp2.CryptoKeySecurity.AddAccessRule(new CryptoKeyAccessRule(securityIdentifier, CryptoKeyRights.FullControl, AccessControlType.Allow));
    
        //Save settings
        using (var rsa2 = new RSACryptoServiceProvider(csp2))
        {
        }
    }
    
    推荐文章