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

时间:2009-11-18 16:28:36

标签: asp.net javascript forms-authentication

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

  

消息:语法错误行:3个字符:1   代码:0 URI:   http://localhost:49791/login.aspx?ReturnUrl=%2fWebImageButton.js

这是因为我在单独的Web Control Project控件中使用自定义图像按钮,该控件将ScriptReference添加到页面中:

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);

    }
}

如果我将以下规则添加到我的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中包含大量文件,但我无法弄清楚如何验证来自嵌入式资源的自动脚本引用。

3 个答案:

答案 0 :(得分:0)

这只是猜测 - 您是否尝试在位置路径中插入通配符?也许类似于&lt; location path =“*。js”&gt;?

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

}