2

在 Medium Trust 中工作时,是否有一种简单的方法可以从 web.config 中为 anonymousIdentification 部分读取 cookieName?

我想要做的是阻止创建成千上万的匿名用户,因为:

  1. 人们关闭了 cookie,或者
  2. 访问者是没有 cookie 功能的蜘蛛/机器人。

我试图通过检查 Application_BeginRequest 中是否存在表单身份验证或匿名标识 cookie 来实现这一点。如果没有 cookie,我会设置一个标志来阻止将任何内容保存到数据库中。

但为了做到这一点,我必须知道 cookie 的名称。为此,我尝试这样做:

AuthCookieName = FormsAuthentication.FormsCookieName;
var anonSection = (AnonymousIdentificationSection)WebConfigurationManager.GetSection("system.web/anonymousIdentification");
if (anonSection != null)
    AnonCookieName = anonSection.CookieName;

虽然检索到 auth cookie 名称没有任何问题,但 WebConfigurationManager 会引发安全异常:System.Security.SecurityException: Request for the permission of type 'System.Configuration.ConfigurationPermission, System.Configuration, Version=4.0.0.0, Culture=neutral , PublicKeyToken=b03f5f7f11d50a3a' 失败。

我知道这是一个信任问题,因为当我给予高或完全信任时,异常就会消失。但是,重要的是这在中等信任中有效,我无法修改 machine.config。

有没有办法requirePermission="false"在我的应用程序的 web.config 级别为 anonymousIdentification 部分设置?

我是否必须在 XML 文档中加载 web.config 并手动解析它?

其他想法?


还有比这更好的吗?我只跑一次Application_Start()

XmlDocument config = new XmlDocument();
config.Load(Server.MapPath("~/Web.config"));
XmlNode anonSection = config.SelectSingleNode("configuration/system.web/anonymousIdentification");
if (anonSection != null)
{
    XmlAttribute nameAttr = anonSection.Attributes["cookieName"];
    if (nameAttr != null)
        AnonCookieName = nameAttr.Value;
}
if (string.IsNullOrWhiteSpace(AnonCookieName))
    AnonCookieName = ".ASPXANONYMOUS";
4

1 回答 1

0

根据微软的说法,Medium Trust 已经死了。但如果你必须这样做,这应该有效:

XmlDocument config = new XmlDocument();
config.Load(Server.MapPath("~/Web.config"));
XmlNode anonSection = config.SelectSingleNode("configuration/system.web/anonymousIdentification");
if (anonSection != null)
{
    XmlAttribute nameAttr = anonSection.Attributes["cookieName"];
    if (nameAttr != null)
        AnonCookieName = nameAttr.Value;
}
if (string.IsNullOrWhiteSpace(AnonCookieName))
    AnonCookieName = ".ASPXANONYMOUS";
于 2014-02-04T21:59:48.447 回答