在IIS 7中,以编程方式为自定义身份应用程序池设置用户帐户

8

在我的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应用程序所安装的文件系统文件夹的读/写权限。

因此,在做研究时,我找到了以下声明

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

那么,如何做到这一点呢?


看看这是否有帮助:http://stackoverflow.com/questions/20138781/how-to-give-folder-permission-for-iis-user-in-c - George Paoli
1
就像之前所解释的那样,您必须将新用户添加到IIS_IUSRS组中,该组是一个AD组。 - D4rkTiger
1个回答

1
如果您需要将该帐户添加到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();
            }
         }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接