ASP.Net-在使用表单身份验证时,如何允许未经身份验证的用户查看导入的脚本文件?

ASP.Net-在使用表单身份验证时,如何允许未经身份验证的用户查看导入的脚本文件?,asp.net,javascript,forms-authentication,Asp.net,Javascript,Forms Authentication,我正在使用ASP.Net和表单身份验证。当用户被定向到登录页面时,我收到一个JavaScript错误: 消息:语法错误行:3字符:1 代码:0 URI: 这是因为我在一个单独的Web控件项目控件中使用了一个自定义图像按钮,该控件将脚本引用添加到页面: public class WebImageButton : LinkButton, IScriptControl, IButtonControl { protected override void OnPreRender(EventArg

我正在使用ASP.Net和表单身份验证。当用户被定向到登录页面时,我收到一个JavaScript错误:

消息:语法错误行:3字符:1 代码:0 URI:

这是因为我在一个单独的Web控件项目控件中使用了一个自定义图像按钮,该控件将脚本引用添加到页面:

public class WebImageButton : LinkButton, IScriptControl, IButtonControl
{
    protected override void OnPreRender(EventArgs e)
    {

        // Link the script up with the script manager
        ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
        if (scriptManager != null)
        {
            scriptManager.RegisterScriptControl(this);
            scriptManager.Scripts.Add(new ScriptReference("<snip>.WebImageButton.js", "<snip>"));
        }

        base.OnPreRender(e);

    }
}
公共类WebImageButton:LinkButton、IScriptControl、IButtonControl
{
受保护的覆盖无效OnPreRender(EventArgs e)
{
//将脚本与脚本管理器链接起来
ScriptManager ScriptManager=ScriptManager.GetCurrent(this.Page);
if(scriptManager!=null)
{
scriptManager.RegisterScriptControl(此);
scriptManager.Scripts.Add(新脚本引用(“.WebImageButton.js”,”);
}
基于预渲染(e);
}
}
如果我将以下规则添加到我的Web.Config中,则文件将成功导入:

<location path="WebImageButton.js">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>

这不是很好,因为我有许多自定义控件可以做同样的事情,而且我并不特别喜欢对它们的每个js文件分别进行身份验证

我是否无法声明应该允许所有导入的脚本引用?我试图在允许的情况下授权WebResource.axd文件,但页面本身(呈现时)实际引用了WebImageButton.js文件

理想情况如下所示:

  <location path="My.WebControlLibraryProject.Controls">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>

是否有任何方法可以在不列出每个文件的情况下实现这一点?

编辑:需要澄清的是,这些脚本文件位于另一个项目中,不在我的实际web项目中。我知道如何声明目录路径的位置路径以在一个wack中包含大量文件,但我不知道如何验证来自嵌入式资源的自动脚本引用。

这只是猜测-您是否尝试在位置路径中添加通配符?也许类似于

您可以指定一个通用位置并将所有脚本放在那里,以便所有不需要授权的脚本都可以通过。您只需要更改到您想要的任何文件夹的路径,并将脚本放在那里


这不仅适用于脚本,也适用于其他资源,如图像、样式表等。

WebImageButton.js是嵌入式资源吗?如我所见,您已经实现了
IScriptControl
。因此,您必须返回
IScriptControl.GetScriptReferences
上的所有脚本引用。我认为嵌入式资源永远不会被授权。我在不同的情况下使用了一些自定义控件,没有任何问题。我想知道脚本管理器是否直接引用了
WebImageButton.js
,而不是以.axd文件的形式。因此,我认为问题来自您的资源文件

public class WebImageButton : LinkButton, IScriptControl, IButtonControl
{

    protected ScriptManager ScriptManager
    {
        get
        {
            ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
            if (scriptManager == null)
            {
                throw new System.Web.HttpException("<snip>");
            }
            return scriptManager;
        }
    }

    protected override void Render(HtmlTextWriter writer)
    {
        base.Render(writer);

        this.ScriptManager.RegisterScriptControl<WebImageButton>(this);
    }

    #region IScriptControl Members

    public System.Collections.Generic.IEnumerable<ScriptDescriptor> GetScriptDescriptors()
    {
        yield break;
    }

    public System.Collections.Generic.IEnumerable<ScriptReference> GetScriptReferences()
    {
        yield return new ScriptReference("<snip>.WebImageButton.js", "Assembly Name");
    }

    #endregion

}
公共类WebImageButton:LinkButton、IScriptControl、IButtonControl
{
受保护的ScriptManager ScriptManager
{
得到
{
ScriptManager ScriptManager=ScriptManager.GetCurrent(此.Page);
if(scriptManager==null)
{
抛出新的System.Web.HttpException(“”);
}
返回脚本管理器;
}
}
受保护的覆盖无效渲染(HtmlTextWriter编写器)
{
base.Render(writer);
this.ScriptManager.RegisterScriptControl(this);
}
#区域IScriptControl成员
public System.Collections.Generic.IEnumerable GetScriptDescriptors()
{
屈服断裂;
}
public System.Collections.Generic.IEnumerable GetScriptReferences()
{
返回新的ScriptReference(“.WebImageButton.js”,“程序集名称”);
}
#端区
}

Nah,您不能将大多数特殊符号放入位置路径。不可能。我的所有脚本都与我的项目分开。正如我在问题中所说,它们都在我的一个单独的web控件项目中。这就是为什么我在库中控件的PreRender事件上导入它们,如我的示例所示。