WebPartManager.IsAuthorized 方法

定義

判斷 WebPart 或其他伺服器控制項是否可以加入至頁面。

多載

IsAuthorized(WebPart)

執行會判斷控制項是否獲得授權可加入至頁面的初始步驟。

IsAuthorized(Type, String, String, Boolean)

執行會判斷控制項是否獲得授權可加入至頁面的最終步驟。

備註

網頁元件功能彈性的一部分是能夠在執行時間將伺服器控制項新增至網頁。 有許多常見的案例,其中伺服器控制項 (可以是自訂控制項、自訂 WebPart 伺服器控制項、使用者控制項或 ASP.NET 控制項) 。

在下列常見案例中,Web 元件控制項集會嘗試將伺服器控制項新增至頁面,並 IsAuthorized 呼叫 方法來授權它們:

  • 新增伺服器控制項時,請在區域內網頁的標記中 WebPartZoneBase 宣告伺服器控制項。

  • 以程式設計方式將伺服器控制項新增至區域時。

  • 當使用者將伺服器控制項匯入控制項的 Web 元件目錄時。

  • 從個人化資料存放區載入現有的伺服器控制項時。

  • 將伺服器控制項新增至 DeclarativeCatalogPart 控制項時,使其可在伺服器控制項的目錄中使用。

在每個新增控制項的案例中 IsAuthorized ,會呼叫 方法,以確保已符合所有授權準則,以允許新增控制項。 當控制項獲得授權時,通常會新增它,就像沒有篩選案例一樣。 當控制項未獲得授權時,Web 元件控制項集可以根據內容以數種方式回應。 如果不需要通知使用者) ,控制項集可能會以無訊息方式無法新增未經授權的元件 (,它可能會顯示錯誤訊息,或將 類別的 UnauthorizedWebPart 實例新增為預留位置。 這個預留位置物件不會顯示在頁面上,但在頁面原始程式碼中會顯示,表示已排除未經授權的控制項。

控制項是否獲得授權的行列式是授權篩選準則。 授權篩選是網頁元件控制項集中的功能,可讓開發人員從頁面排除不符合指定準則的任何控制項。

若要建立篩選案例,開發人員必須執行兩件事。 首先,它們必須指派字串值, (值可以是任意) 到 AuthorizationFilter 他們打算在案例中使用的每個 WebPart 控制項的 屬性。 它們也可以為非 WebPart 控制項的其他伺服器控制項類型指派值給此屬性,因為如果這些控制項放在 WebPartZoneBase 區域中,這類控制項會在執行時間以 GenericWebPart 控制項包裝,而且此控制項會 AuthorizationFilter 繼承 屬性。

建立篩選案例的第二個必要步驟是覆寫 IsAuthorized(Type, String, String, Boolean) 方法,或建立事件的事件處理常式 AuthorizeWebPart 。 在這些方法中,開發人員可以檢查 AuthorizationFilter 屬性,如果值指出控制項不應該獲得授權,開發人員可確保 IsAuthorized 方法傳回 的值 false

注意

如需如何使用 方法設定自訂篩選案例 IsAuthorized 的程式碼範例和說明,請參閱 方法多載的主題。

IsAuthorized(WebPart)

執行會判斷控制項是否獲得授權可加入至頁面的初始步驟。

public:
 bool IsAuthorized(System::Web::UI::WebControls::WebParts::WebPart ^ webPart);
public bool IsAuthorized (System.Web.UI.WebControls.WebParts.WebPart webPart);
member this.IsAuthorized : System.Web.UI.WebControls.WebParts.WebPart -> bool
Public Function IsAuthorized (webPart As WebPart) As Boolean

參數

webPart
WebPart

正在檢查授權的 WebPart 或其他伺服器控制項。

傳回

指出 webPart 是否可加入至頁面上的布林值。

例外狀況

webPartnull

範例

下列程式碼範例示範如何從程式碼呼叫 IsAuthorized(WebPart) 方法,以判斷控制項是否有權新增至頁面。

程式碼範例有三個部分:

此程式碼範例會使用自訂 WebPartManager 控制項來覆寫 IsAuthorized(Type, String, String, Boolean) 多載方法,以提供 屬性的 AuthorizationFilter 自訂處理。 此控制項會檢查 的屬性值 admin ,如果值存在,則會授權控制項。 如果控制項具有不同的值,則不會獲得授權;沒有屬性值的控制項也會獲得授權,因為它們假設不會成為篩選案例的一部分。

若要執行此程式碼範例,您必須編譯此原始程式碼。 您可以明確地編譯它,並將產生的元件放在網站的 Bin 資料夾或全域組件快取中。 或者,您可以將原始程式碼放在月臺的 App_Code 資料夾中,其將在執行時間動態編譯。 此程式碼範例會使用動態編譯方法。 如需示範如何編譯的逐步解說,請參閱逐步解說 :開發和使用自訂 Web 服務器控制項

using System;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace Samples.AspNet.CS.Controls
{
  public class MyManagerAuthorize : WebPartManager
  {
    public override bool IsAuthorized(Type type, string path, string authorizationFilter, bool isShared)
    {
      if (!String.IsNullOrEmpty(authorizationFilter))
      {
        if (authorizationFilter == "admin")
          return true;
        else
          return false;
      }
      else
            {
                return true;
            }
        }
  }
}
Imports System.Web
Imports System.Web.Security
Imports System.Security.Permissions
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts

Namespace Samples.AspNet.VB.Controls

  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public Class MyManagerAuthorize
    Inherits WebPartManager

    Public Overrides Function IsAuthorized(ByVal type As Type, _
      ByVal path As String, ByVal authorizationFilter As String, _
      ByVal isShared As Boolean) As Boolean

      If Not String.IsNullOrEmpty(authorizationFilter) Then
        If authorizationFilter = "admin" Then
          Return True
        Else
          Return False
        End If
      Else
        Return True
      End If

    End Function

  End Class

End Namespace

程式碼範例的第二個部分會建立可能排除控制項的篩選準則。 下列網頁在 元素中包含 <asp:webpartzone> 三個 ASP.NET 伺服器控制項。 請注意,第一個和第二個控制項的屬性 AuthorizationFilter 會設定為不同的值,而第三個控制項不會指派屬性。 此授權值可以在執行時間檢查,如果篩選符合開發人員所設定的準則,則可以將控制項新增至頁面。 另請注意,在 方法中 Page_Load ,程式碼會呼叫 IsAuthorized(WebPart) 方法來判斷每個控制項是否獲得授權,如果是的話,它會設定每個控制項的 ExportMode 屬性。

<%@ Page Language="C#" %>
<%@ Register Namespace="Samples.AspNet.CS.Controls" 
    TagPrefix="aspSample"%>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
  
  protected void Page_Load(object sender, EventArgs e)
  {
    foreach (WebPart part in mgr1.WebParts)
    {
      if (mgr1.IsAuthorized(part))
        part.ExportMode = WebPartExportMode.All;
    }
    
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <aspSample:MyManagerAuthorize ID="mgr1" runat="server"  />
      <asp:WebPartZone ID="WebPartZone1" runat="server">
        <ZoneTemplate>
          <asp:BulletedList 
            ID="BulletedList1" 
            Runat="server"
            DisplayMode="HyperLink" 
            Title="Favorite Links"
            AuthorizationFilter="admin">
            <asp:ListItem Value="http://msdn.microsoft.com">
              MSDN
            </asp:ListItem>
            <asp:ListItem Value="http://www.asp.net">
              ASP.NET
            </asp:ListItem>
            <asp:ListItem Value="http://www.msn.com">
              MSN
            </asp:ListItem>
          </asp:BulletedList>
          <asp:Label ID="Label1" runat="server" 
            Text="Hello World"
            AuthorizationFilter="user" />
          <asp:Calendar ID="Calendar1" runat="server"></asp:Calendar>
        </ZoneTemplate>
      </asp:WebPartZone>
      <hr />
      <asp:Literal ID="Literal1" runat="server"></asp:Literal>
    </div>
    </form>
</body>
</html>
<%@ Page Language="vb" %>
<%@ Register Namespace="Samples.AspNet.VB.Controls" 
    TagPrefix="aspSample"%>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

  Protected Sub Page_Load(ByVal sender As Object, _
    ByVal e As System.EventArgs)
    
    Dim part As WebPart
    For Each part In mgr1.WebParts
      If mgr1.IsAuthorized(part) Then
        part.ExportMode = WebPartExportMode.All
      End If
    Next
  End Sub

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <aspSample:MyManagerAuthorize ID="mgr1" runat="server"  />
      <asp:WebPartZone ID="WebPartZone1" runat="server">
        <ZoneTemplate>
          <asp:BulletedList 
            ID="BulletedList1" 
            Runat="server"
            DisplayMode="HyperLink" 
            Title="Favorite Links"
            AuthorizationFilter="admin">
            <asp:ListItem Value="http://msdn.microsoft.com">
              MSDN
            </asp:ListItem>
            <asp:ListItem Value="http://www.asp.net">
              ASP.NET
            </asp:ListItem>
            <asp:ListItem Value="http://www.msn.com">
              MSN
            </asp:ListItem>
          </asp:BulletedList>
          <asp:Label ID="Label1" runat="server" 
            Text="Hello World"
            AuthorizationFilter="user" />
          <asp:Calendar ID="Calendar1" runat="server"></asp:Calendar>
        </ZoneTemplate>
      </asp:WebPartZone>
      <hr />
      <asp:Literal ID="Literal1" runat="server"></asp:Literal>
    </div>
    </form>
</body>
</html>

請注意,若要讓程式碼範例能夠運作,您必須在Web.config檔案中新增設定,以啟用匯出網頁元件描述檔案。 請確定您在與這個程式碼範例網頁相同的目錄中有一個Web.config檔案。 在 區 <system.web> 段中,請確定有屬性 <webParts>enableExport 設定為 true 的專案,如下列標記所示。

<webParts enableExport="true">

...

</webParts>

在瀏覽器中載入頁面之後,請注意會顯示第一個控制項,因為它符合覆寫方法中的準則。 第二個控制項不會新增至頁面,因為篩選會排除它。 也會新增第三個控制項,因為它沒有其 AuthorizationFilter 屬性集。 請注意,如果您按一下任一控制項標題列中的動詞功能表圖示,則可以匯出它們,因為它們 ExportMode 各自的屬性值已指派。

備註

方法是 IsAuthorized Web 元件控制項所呼叫的初始方法,設定為檢查控制項的 WebPart 授權。 它會接受 webPart 做為參數,並開始一個程式,最終判斷控制項是否會新增至頁面。 當您需要判斷指定的控制項是否獲得授權時,請直接從程式碼呼叫這個方法。

這個方法會執行判斷控制項是否繼承自 WebPart 類別或 控制項 GenericWebPart 的初始工作,如果是,則為它所包含的子控制項類型。 若要完成授權工作,它會呼叫 IsAuthorized(Type, String, String, Boolean) 多載方法。

給呼叫者的注意事項

這個方法會直接從您的程式碼呼叫。 如果您想要更充分地控制授權程式,您可以覆寫 IsAuthorized(Type, String, String, Boolean) 多載方法。

另請參閱

適用於

IsAuthorized(Type, String, String, Boolean)

執行會判斷控制項是否獲得授權可加入至頁面的最終步驟。

public:
 virtual bool IsAuthorized(Type ^ type, System::String ^ path, System::String ^ authorizationFilter, bool isShared);
public virtual bool IsAuthorized (Type type, string path, string authorizationFilter, bool isShared);
abstract member IsAuthorized : Type * string * string * bool -> bool
override this.IsAuthorized : Type * string * string * bool -> bool
Public Overridable Function IsAuthorized (type As Type, path As String, authorizationFilter As String, isShared As Boolean) As Boolean

參數

type
Type

正在檢查授權之控制項的 Type

path
String

正在授權之控制項的原始程式檔的相對應用程式路徑,若是使用者控制項。

authorizationFilter
String

指定給 AuthorizationFilter 控制項之 WebPart 屬性的任意字串值,用來授權控制項是否可以加入至頁面。

isShared
Boolean

指出正在檢查授權的控制項是否為共用控制項,表示對應用程式的多數或所有使用者都是可見,並且其 IsShared 屬性值設為 true

傳回

布林值,指出控制項是否獲得授權,可加入至頁面。

例外狀況

typenull

type 是使用者控制項,但 pathnull 或空字串 ("")。

-或-

type 不是使用者控制項,但 path 有指定的值。

範例

下列程式碼範例示範如何覆寫 IsAuthorized 方法,以判斷控制項是否已獲授權加入頁面。

第一個步驟是建立可能排除控制項的篩選準則。 下列網頁在 元素中包含 <asp:webpartzone> 三個 ASP.NET 伺服器控制項。 請注意,第一個和第二個控制項的屬性 AuthorizationFilter 會設定為不同的值,而第三個控制項不會指派屬性。 此授權值可以在執行時間檢查,如果篩選符合開發人員所設定的準則,則可以將控制項新增至頁面。

<%@ Page Language="C#" %>
<%@ Register Namespace="Samples.AspNet.CS.Controls" 
    TagPrefix="aspSample"%>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
  
  protected void Page_Load(object sender, EventArgs e)
  {
    foreach (WebPart part in mgr1.WebParts)
    {
      if (mgr1.IsAuthorized(part))
        part.ExportMode = WebPartExportMode.All;
    }
    
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <aspSample:MyManagerAuthorize ID="mgr1" runat="server"  />
      <asp:WebPartZone ID="WebPartZone1" runat="server">
        <ZoneTemplate>
          <asp:BulletedList 
            ID="BulletedList1" 
            Runat="server"
            DisplayMode="HyperLink" 
            Title="Favorite Links"
            AuthorizationFilter="admin">
            <asp:ListItem Value="http://msdn.microsoft.com">
              MSDN
            </asp:ListItem>
            <asp:ListItem Value="http://www.asp.net">
              ASP.NET
            </asp:ListItem>
            <asp:ListItem Value="http://www.msn.com">
              MSN
            </asp:ListItem>
          </asp:BulletedList>
          <asp:Label ID="Label1" runat="server" 
            Text="Hello World"
            AuthorizationFilter="user" />
          <asp:Calendar ID="Calendar1" runat="server"></asp:Calendar>
        </ZoneTemplate>
      </asp:WebPartZone>
      <hr />
      <asp:Literal ID="Literal1" runat="server"></asp:Literal>
    </div>
    </form>
</body>
</html>
<%@ Page Language="vb" %>
<%@ Register Namespace="Samples.AspNet.VB.Controls" 
    TagPrefix="aspSample"%>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

  Protected Sub Page_Load(ByVal sender As Object, _
    ByVal e As System.EventArgs)
    
    Dim part As WebPart
    For Each part In mgr1.WebParts
      If mgr1.IsAuthorized(part) Then
        part.ExportMode = WebPartExportMode.All
      End If
    Next
  End Sub

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <aspSample:MyManagerAuthorize ID="mgr1" runat="server"  />
      <asp:WebPartZone ID="WebPartZone1" runat="server">
        <ZoneTemplate>
          <asp:BulletedList 
            ID="BulletedList1" 
            Runat="server"
            DisplayMode="HyperLink" 
            Title="Favorite Links"
            AuthorizationFilter="admin">
            <asp:ListItem Value="http://msdn.microsoft.com">
              MSDN
            </asp:ListItem>
            <asp:ListItem Value="http://www.asp.net">
              ASP.NET
            </asp:ListItem>
            <asp:ListItem Value="http://www.msn.com">
              MSN
            </asp:ListItem>
          </asp:BulletedList>
          <asp:Label ID="Label1" runat="server" 
            Text="Hello World"
            AuthorizationFilter="user" />
          <asp:Calendar ID="Calendar1" runat="server"></asp:Calendar>
        </ZoneTemplate>
      </asp:WebPartZone>
      <hr />
      <asp:Literal ID="Literal1" runat="server"></asp:Literal>
    </div>
    </form>
</body>
</html>

第二個步驟是覆寫 IsAuthorized(Type, String, String, Boolean) 方法,並建立授權篩選的自訂處理。 請注意,程式碼會先檢查屬性是否有值,以便自動新增未指派 AuthorizationFilter 屬性的任何控制項。 如果控制項有篩選,則只有在篩選值等於 admin 時,程式碼才會傳回 true 。 這示範一種簡單的機制,您可以根據使用者的角色,將特定控制項顯示給特定使用者。 雖然使用角色的完整範例超出本主題的範圍,但您可以使用與此程式碼範例中覆寫方法相同的邏輯,但您可以檢查目前使用者是否為符合授權篩選值的角色,然後只為該使用者新增控制項。 這可讓您建立頁面,其中有些使用者會看到所有控制項,而其他使用者只會看到選取的控制項。 這是您在使用角色時,檢查篩選準則的邏輯外觀:

If Roles.IsUserInRole(Page.User.Identity.Name, authorizationFilter) Then  
  return True  
Else  
  return False  
End If  
if(Roles.IsUserInRole(Page.User.Identity.Name, authorizationFilter))  
    return true;  
else  
    return false;  

若要執行程式碼範例,您必須編譯此原始程式碼。 您可以明確地編譯它,並將產生的元件放在網站的 Bin 資料夾或全域組件快取中。 或者,您可以將原始程式碼放在月臺的 App_Code 資料夾中,其將在執行時間動態編譯。 此程式碼範例會使用動態編譯方法。 如需示範如何編譯的逐步解說,請參閱逐步解說 :開發和使用自訂 Web 服務器控制項

using System;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace Samples.AspNet.CS.Controls
{
  public class MyManagerAuthorize : WebPartManager
  {
    public override bool IsAuthorized(Type type, string path, string authorizationFilter, bool isShared)
    {
      if (!String.IsNullOrEmpty(authorizationFilter))
      {
        if (authorizationFilter == "admin")
          return true;
        else
          return false;
      }
      else
            {
                return true;
            }
        }
  }
}
Imports System.Web
Imports System.Web.Security
Imports System.Security.Permissions
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts

Namespace Samples.AspNet.VB.Controls

  <AspNetHostingPermission(SecurityAction.Demand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  <AspNetHostingPermission(SecurityAction.InheritanceDemand, _
    Level:=AspNetHostingPermissionLevel.Minimal)> _
  Public Class MyManagerAuthorize
    Inherits WebPartManager

    Public Overrides Function IsAuthorized(ByVal type As Type, _
      ByVal path As String, ByVal authorizationFilter As String, _
      ByVal isShared As Boolean) As Boolean

      If Not String.IsNullOrEmpty(authorizationFilter) Then
        If authorizationFilter = "admin" Then
          Return True
        Else
          Return False
        End If
      Else
        Return True
      End If

    End Function

  End Class

End Namespace

在瀏覽器中載入頁面之後,請注意會顯示第一個控制項,因為它符合覆寫方法中的準則。 第二個控制項不會新增至頁面,因為它的篩選值已排除。 新增第三個控制項,因為它沒有其 AuthorizationFilter 屬性集。 如果您變更第二個控制項上的 屬性值以符合第一個控制項的屬性值,然後再次執行頁面,也會新增第二個控制項。

備註

IsAuthorized(Type, String, String, Boolean)多載方法會執行最後一個步驟,以判斷控制項是否有權新增至頁面。 方法可確保 type 是有效的類型,而且 path 只有在所檢查的控制項是使用者控制項時,才會有值。 然後它會呼叫會引發 AuthorizeWebPart 事件的重要 OnAuthorizeWebPart 方法。

給繼承者的注意事項

如果您想要在檢查授權時提供額外的處理,可以藉由繼承自 WebPartManager 類別來覆寫這個方法。 您可能想要覆寫 方法來檢查 參數中的 authorizationFilter 特定值,並根據值傳回 Boolean 值,以判斷控制項是否要加入頁面。

對於也想要檢查授權篩選器並提供自訂處理的頁面開發人員,可以選擇在 .aspx 頁面或程式碼後置檔案中內嵌執行此動作,而不需要繼承任何類別。 您可以在 控制項的 方法 WebPartManager 頁面中 OnAuthorizeWebPart(WebPartAuthorizationEventArgs) 宣告替代事件處理常式。 如需詳細資訊和範例,請參閱 OnAuthorizeWebPart(WebPartAuthorizationEventArgs) 方法。

另請參閱

適用於