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

本文关键字:程序池 应用程序 应用 设置 用户 标识 自定义 方式 编程 IIS | 更新日期: 2023-09-27 18:33:59

在我的 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;
}

将用户添加到活动目录的位置如下:

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 应用程序无法运行,因为它没有足够的权限。对我来说更重要的是,即使我手动将此新用户帐户的读/写权限设置为安装我的 Web 应用程序的文件系统文件夹,某些 .NET 类(如 System.Security.Cryptography(也会失败并出现意外的错误代码。

因此,在进行研究时,我发现了以下陈述:

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

那么,你怎么做呢?

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

如果需要将该帐户添加到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();
            }
         }
    }
}
相关文章: