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

因此,在进行研究时,我发现了以下声明

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

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

4

1 回答 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();
            }
         }
    }
}
于 2017-01-28T17:54:47.597 回答