【问题标题】:ASP.Net - How can I allow imported script files be viewed by unauthenticated users when using Forms Authentication?ASP.Net - 使用表单身份验证时,如何允许未经身份验证的用户查看导入的脚本文件?
【发布时间】:2009-11-18 16:28:35
【问题描述】:

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

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

这是因为我在单独的 Web 控制项目控件中使用了自定义图像按钮,该控件向页面添加了 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 项目中。我知道如何声明目录路径的位置路径以一次性包含大量文件,但我不知道如何验证来自嵌入式资源的自动脚本引用。

【问题讨论】:

    标签: asp.net javascript forms-authentication


    【解决方案1】:

    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
    
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 不,您不能将大多数特殊符号放入位置路径。
      【解决方案3】:

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

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

      【讨论】:

      • 不可能。我所有的脚本都与我的项目分开。就像我在问题中所说的那样,它们都在我的一个单独的 Web 控制项目中。这就是为什么我按照我的示例在库中控件的 PreRender 事件上导入它们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 2015-04-20
      • 1970-01-01
      • 2013-05-31
      • 2020-11-15
      • 2016-01-17
      相关资源
      最近更新 更多