感谢CodeProject及其所有贡献者提供的优质文章,从这个网站上学到了很多,因此非常感激。这是第一次尝试发布一篇简短的文章,相信这将帮助开发者在需要以编程方式执行IIS设置时。
本文旨在帮助开发者使用安装程序类为网站设置认证和权限。这在开发者对部署过程没有或几乎没有控制权的情况下特别有用。
在某些情况下,开发者希望确保网站必须启用特定类型的认证,例如启用Windows身份验证并禁用其他所有认证。
有两个要求:
上述两个要求应该在不进行手动设置的情况下自动完成,即一旦部署设置完成,工程师就不应该手动更改设置,它们应该自动应用。
在继续之前,想提一下,参考了不同的网站和自己的逻辑来达到这个阶段,所以目前没有参考URL,但如果他们看到这篇文章,会感谢他们。
请查看附加的zip文件,其中包含所有完整的示例代码、ReadMe.txt和文档,详细说明了在设置期间如何为虚拟目录设置权限,以及如何在设置期间设置所需的认证。
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
stateSaver.Add("targetvdir", Context.Parameters["targetvdir"].ToString());
configureIIS(Context.Parameters["targetvdir"].ToString());
if (!EventLog.SourceExists("SampleApplication"))
{
EventSourceCreationData mySource = new EventSourceCreationData("SampleApplication", "SampleApplicationLogs");
EventLog.CreateEventSource(mySource);
EventLog.WriteEntry("SampleApplication", "SampleApplication IIS Settings done.");
EventLog.WriteEntry("SampleApplication", "targetvdir..." + Context.Parameters["targetvdir"].ToString());
}
else
{
EventLog.WriteEntry("SampleApplication", "SampleApplication IIS Settings done.");
EventLog.WriteEntry("SampleApplication", "targetvdir..." + Context.Parameters["targetvdir"].ToString());
}
stateSaver.Add("targetdir", Context.Parameters["targetdir"].ToString());
DirectorySecurity dirSec = Directory.GetAccessControl(Context.Parameters["targetdir"].ToString());
FileSystemAccessRule fsar = new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow);
dirSec.AddAccessRule(fsar);
FileSystemAccessRule fNet = new FileSystemAccessRule("NETWORK", FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow);
dirSec.AddAccessRule(fNet);
FileSystemAccessRule fNetServ = new FileSystemAccessRule("NETWORK SERVICE", FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow);
dirSec.AddAccessRule(fNetServ);
Directory.SetAccessControl(Context.Parameters["targetdir"].ToString(), dirSec);
}
此方法更改特定Web应用程序名称的安全设置。
private void configureIIS(string vdName)
{
using (ServerManager serverManager = new ServerManager())
{
Microsoft.Web.Administration.Configuration config = serverManager.GetApplicationHostConfiguration();
Microsoft.Web.Administration.ConfigurationSection anonymousAuthenticationSection = config.GetSection("system.webServer/security/authentication/anonymousAuthentication", "Default Web Site/" + vdName);
anonymousAuthenticationSection["enabled"] = false;
Microsoft.Web.Administration.ConfigurationSection windowsAuthenticationSection = config.GetSection("system.webServer/security/authentication/windowsAuthentication", "Default Web Site/" + vdName);
windowsAuthenticationSection["enabled"] = true;
serverManager.CommitChanges();
}
}
可以轻松识别ConfigureIIS方法确保设置了Windows身份验证属性,并将匿名设置为false。
为了创建部署包,开发者需要安装部署类型的项目。这可以从下载。
一旦安装了部署包,开发者可以添加部署类型的项目。
假设已经准备好了Web解决方案,可以添加部署类型的项目。
确保应用程序设置为发布模式,构建解决方案。
现在让添加安装程序类,可以通过添加类库然后添加安装程序类来完成。
删除默认类并添加安装程序类。
右键单击解决方案文件并添加Web设置项目。
右键单击Web设置 -> 添加 -> 项目输出。
出现弹出窗口,添加部署项目和安装程序类的主要输出。
点击确定。
右键单击Web设置项目并添加自定义操作。
右键单击自定义操作中的安装节点并添加。
点击属性或按F7键并添加以下自定义操作数据。
右键单击解决方案资源管理器中的解决方案文件并构建解决方案。
构建成功后,打开设置文件夹。
从设置项目的发布文件夹中运行安装程序。
Microsoft.Web.Administration.Configuration config = serverManager.GetApplicationHostConfiguration();
Microsoft.Web.Administration.ConfigurationSection anonymousAuthenticationSection = config.GetSection("system.webServer/security/authentication/anonymousAuthentication", "Default Web Site/" + vdName);
anonymousAuthenticationSection["enabled"] = false;
Microsoft.Web.Administration.ConfigurationSection windowsAuthenticationSection = config.GetSection("system.webServer/security/authentication/windowsAuthentication", "Default Web Site/" + vdName);
windowsAuthenticationSection["enabled"] = true;
serverManager.CommitChanges();