从web.config读取AuthorizationSection提供错误的值

Bob*_*orn 5 c# asp.net web-config

编辑#2:config.FilePath显示它正在查看与我期望的文件不同的文件:“ C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \ web.config”。我期望它在我的项目中使用web.config。需要弄清楚为什么会这样。

我的Web API中有一个方法,试图从web.config中的授权部分读取值。根据我的发现,这应该可以工作:

    public AuthorizationSetting GetAuthorizationSettings()
    {
        var config = WebConfigurationManager.OpenWebConfiguration(null);
        var section = config.GetSection("system.web/authorization") as AuthorizationSection;

        foreach (AuthorizationRule rule in section.Rules)
        {
            if (rule.Action.ToString().ToLower() == "allow")
            {
                Debug.WriteLine(rule);
            }
        }

        return new AuthorizationSetting();
    }
Run Code Online (Sandbox Code Playgroud)

这是web.config中包含授权信息的部分:

  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <identity impersonate="true" />
    <authentication mode="Windows" />
    <authorization>
      <allow roles="role1,role2,role3"/>
      <deny users="*"/>
    </authorization>
  </system.web>
Run Code Online (Sandbox Code Playgroud)

您会看到有一个允许和一个拒绝。当我运行代码时,似乎只有一条规则。既然有一个允许和一个拒绝,就不应该有两个吗?一个规则看起来是对用户具有“允许”和“ *”的操作。那不是web.config中的内容。我在这里想念什么?

在此处输入图片说明

**编辑**我考虑了它正在读取其他web.config文件的可能性。但是解决方案中只有一个其他的web.config文件(在“视图”下)。我也将其更改为具有相同的授权部分,但仍得到相同的结果。

Pet*_*orf 2

正如您已经弄清楚的那样,使用Nullin 作为加载服务器根 web.configpath的参数OpenWebConfiguration

%SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\Config\
Run Code Online (Sandbox Code Playgroud)

文档说:

The virtual path to the configuration file. If null, the root Web.config file is opened.

但我们可以假设它是站点的根 Web 配置,而不是服务器。无论如何,尝试使用:

var config = WebConfigurationManager.OpenWebConfiguration("~");
Run Code Online (Sandbox Code Playgroud)