以编程方式在IIS 7中设置自定义标识应用程序池的用户帐户

时间:2013-10-05 21:07:05

标签: c# asp.net .net security iis

在我的C#代码中,我需要为我的Web应用程序创建自定义标识并将其添加到IIS 7.我执行以下操作:

string strAppPoolName = "MyAppPool";
string strUserName = Environment.UserDomainName + "\\" + "myappusername";

addUserAccount(strUserName, strUserPass);

using (ServerManager serverManager = new ServerManager())
{
    //Add application pool
    ApplicationPool appPool = serverManager.ApplicationPools.Add(strAppPoolName);
    appPool.AutoStart = true;

    appPool.ManagedPipelineMode = ManagedPipelineMode.Integrated;
    appPool.ManagedRuntimeVersion = "v4.0";

    appPool.ProcessModel.MaxProcesses = 1;

    //Assign identity to a custom user account
    appPool.ProcessModel.IdentityType = ProcessModelIdentityType.SpecificUser;
    appPool.ProcessModel.UserName = strUserName;
    appPool.ProcessModel.Password = strUserPass;
}

将用户添加到Active Directory中的位置:

public static void addUserAccount(string sUserName, string sPassword)
{
    using (PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain))
    {
        using (UserPrincipal up = new UserPrincipal(oPrincipalContext))
        {
            up.SamAccountName = sUserName;
            up.SetPassword(sPassword);
            up.Enabled = true;
            up.PasswordNeverExpires = true;
            up.Description = "My app's user account";

            up.Save();
        }
    }
}

问题是,当我稍后将该站点和应用程序添加到该应用程序池下的IIS 7时,Web应用程序无法运行,因为它没有足够的权限。更重要的是,对于我来说,某些.NET类(例如System.Security.Cryptography)会因意外错误代码而失败,即使我手动将此新用户帐户的读/写权限设置为安装了我的Web应用程序的文件系统文件夹。

因此,在进行研究时,我找到了following statement

  

如果您使用自定义标识,请确保您拥有该用户帐户   指定是Web服务器上IIS_IUSRS组的成员   该帐户具有适当的资源访问权限。另外,当你使用时   您可能会在您的环境中进行Windows和Kerberos身份验证   需要在域中注册服务主体名称(SPN)   控制器(DC)。

那么,你是怎么做到的?

1 个答案:

答案 0 :(得分:0)

如果您需要将该帐户添加到IIS_IUSERS组(在计算机上是本地的),您可以使用GroupPrincipal。请记住为您的计算机创建本地PrincipalContext,而不是您为用户使用的域名。您只需按标识查找组,然后将新创建的用户添加到Members集合中。 Add方法的重载接受UserPrincipal

您的代码是这样的:

using (PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain))
{
    using (PrincipalContext oGroupContext = new PrincipalContext(ContextType.Machine))
    {
        // find the local group IIS_IUSRS
        using(var gp = GroupPrincipal.FindByIdentity(oGroupContext,"IIS_IUSRS"))
        {
            using (UserPrincipal up = new UserPrincipal(oPrincipalContext))
            {
                up.SamAccountName = sUserName;
                up.SetPassword(sPassword);
                up.Enabled = true;
                up.PasswordNeverExpires = true;
                up.Description = "My app's user account";

                up.Save();

                // add new user to Members of group
                gp.Members.Add(up);
                // save before Disposing!
                gp.Save();
            }
         }
    }
}