2009-11-18 30 views
0

我使用ASP.Net和表單身份驗證。當用戶被定向到登錄頁面,我得到一個JavaScript錯誤:ASP.Net - 如何在使用表單身份驗證時允許未經身份驗證的用戶查看導入的腳本文件?

Message: Syntax error Line: 3 Char: 1 Code: 0 URI: http://localhost:49791/login.aspx?ReturnUrl=%2fWebImageButton.js

這是因爲我使用一個單獨的網絡控制項目的控制,增加了使用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> 

這是不是很好,因爲我有一些自定義的控件,做T他同樣的事情,我並不特別喜歡單獨驗證他們的每個js文件。

是否有沒有辦法可以聲明所有導入的腳本引用都應該被允許?我試圖在允許的情況下授權WebResource.axd文件,但是頁面本身(渲染時)會物理引用WebImageButton.js文件。

理想的情況是類似以下內容:

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

有什麼辦法來實現這一目標,而不列出每個文件?


編輯:要清楚,這些腳本文件在另一個項目中,不在我的實際Web項目。我知道如何聲明目錄路徑的位置路徑以包含大量文件,但我無法弄清楚如何驗證來自嵌入式資源的自動腳本引用。

回答

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 

} 
0

這只是一個猜測 - 你有沒有嘗試把通配符放在位置路徑?也許像< location path =「*。js」>?

+0

那麼,你不能把最特殊的符號放到位置路徑。 – GenericTypeTea 2009-11-18 16:38:42

0

您可以指定一個通用位置並將所有腳本放在那裏,以便所有不需要授權的腳本都能通過。您只需將路徑更改爲您想要的文件夾並將腳本放在那裏。

這將不僅腳本的工作,但其他資源以及,如圖像,樣式表等

+0

不可能。我的所有腳本都與我的項目分開。就像我在我的問題中所說的,他們都在我的一個單獨的Web控制項目中。這就是爲什麼我按照我的例子將它們導入庫中控件的PreRender事件。 – GenericTypeTea 2009-11-18 16:40:02

相關問題