<location path=“something” 比较如何工作?

How does the <location path="something" comparison work?

提问人:CarComp 提问时间:3/23/2017 最后编辑:CarComp 更新时间:3/23/2017 访问量:26

问:

我正在尝试使用某些旧版本的 Windows Identity Foundation 修复旧站点的问题。我遇到的问题之一是,由于它不是 MVC 站点,我无法对控制器操作进行身份验证。我们的网站刚刚在每个页面上强制进行身份验证,包括所有设置如下的页面......

<location path="Syndication.aspx">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>

因为我们有

<system.web>
    <authentication mode="None" />
    <authorization>
      <deny users="?" />
    </authorization>

设置,使 WIF 正常工作。

因此,我只能在 global.asax 中编写这样的巨型杂物,以尝试“读取”web.config 并神圣化每个项目的授权级别。<Location>

private void Application_AuthenticateRequest(object sender, EventArgs e)
{
    HttpApplication htApp = (HttpApplication)sender;

    Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
    ConfigurationLocationCollection section = config.Locations;

    foreach (ConfigurationLocation location in section)
    {
        Configuration rootConfiguration = location.OpenConfiguration();
        PropertyInformationCollection props = rootConfiguration.GetSection("system.web/authorization").ElementInformation.Properties;

        foreach (PropertyInformation prop in props)
        {
            AuthorizationRuleCollection arc = prop.Value as AuthorizationRuleCollection;
            if (arc == null) continue;

            foreach (AuthorizationRule rule in arc)
            {
                if (!rule.ElementInformation.IsPresent || rule.Users[0] != "*") continue;

                if (htApp.Request.CurrentExecutionFilePathExtension != null)
                {
                    // Clean up the current request name
                    string tmp = htApp.Request.CurrentExecutionFilePath;
                    if (!string.IsNullOrEmpty(htApp.Request.CurrentExecutionFilePathExtension))
                    {
                        tmp = tmp.Replace(htApp.Request.CurrentExecutionFilePathExtension, string.Empty);
                    }

                    if (tmp.StartsWith("/"))
                    {
                        tmp = tmp.Remove(0, 1);
                    }

                    // something has to make sense at some point
                    // figure out how to compare this to 
                    if (tmp.Contains(location.Path) || location.Path.Contains(tmp))
                    {
                        HttpContext.Current.SkipAuthorization = true;
                    }
                }


            }
        }
    }

}

这可行,但它可能有安全漏洞,并且有可怕的代码气味。而且我真的不能提交它进行代码审查,因为每个人都会嘲笑并认为我是个白痴。

我需要知道如何在 web.config 中获取由 确定的布尔值,并且我需要在身份验证操作发生之前找到一些在 global.asax 中执行此操作的方法。<location path="something">

如何确定当前 url 的路径是否与 web.config 中的路径“等效”?<location path

编辑:我希望能得到我想要的东西,但它都是空的。this.Context.Request.RequestContext.RouteData

.NET Web-config 位置 比较 授权

评论

0赞 Piotr M 9/27/2017
你找到答案了吗?

答: 暂无答案