以编程方式在 IIS 中启用或禁用匿名身份验证

Programmatically enable or disable anonymous authentication in IIS

我有一个 Web 应用程序,我需要为其用户提供将登录方法从 FormsAuth 切换到 WindowsAuth 的选项。我设法通过代码更改 web.config 文件:

Configuration config = WebConfigurationManager.OpenWebConfiguration(Url.Content("~"));
AuthenticationSection auth = ((AuthenticationSection)(config.SectionGroups["system.web"].Sections["authentication"]));
auth.Mode = AuthenticationMode.Windows; // Or Forms if I want to.
config.Save();

但问题是,当我使用 FormsAuth 时,我需要打开 Anonymouse 身份验证选项,而当我使用 WinAuth 时,我需要关闭它。我只是找不到通过代码更改该选项的方法。

互联网上的一切都说要这样做:

<security>
 <authentication>
  <anonymousAuthentication enabled="false/true" />
 </authentication>
</security>

但是当我将它插入到我的网络应用程序的 web.config 时,它说配置错误。比我读到的这可能适用于另一个配置文件,如 appHost.config 或类似的东西,但我更喜欢只对我自己的应用程序而不是 IIS 进行更改我希望你明白为什么。

那么,我该怎么做呢?

您正在尝试更新错误的部分。 anonymousAuthentication 是 system.webServer 而不是 system.web 的一部分。正确的配置是

<system.webServer>
<security>
  <authentication>
    <anonymousAuthentication enabled="true" />
  </authentication>
</security>
</system.webServer>

您可以使用 Microsoft.Web.Administration 中的 ServerManager class 对其进行修改。搜索 nugget 包 "Microsoft.Web.Administration"。使用 nugget 添加对 Microsoft.Web.Administration.dll 的引用后,您可以使用如下代码对其进行修改:

        using (ServerManager serverManager = new ServerManager())
        {
            Microsoft.Web.Administration.Configuration config = serverManager.GetApplicationHostConfiguration();
            Microsoft.Web.Administration.ConfigurationSection anonymousAuthenticationSection = config.GetSection("system.webServer/security/authentication/anonymousAuthentication");
            anonymousAuthenticationSection["enabled"] = true;                
            serverManager.CommitChanges();
        } 

好吧,原来我找不到动态更改身份验证模式的方法,但我找到了解决问题的非常巧妙的方法:我创建了另一个 Web 应用程序,将其嵌套在第一个应用程序中,设置了第一个表单身份验证模式和嵌套的 Windows 以及每当我需要使用 IIS 的功能来处理域、用户组等时,我使用从一个到另一个的重定向,通过 cookie 传递数据并作为 url参数。