首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Windows Workflow Foundation 權限控制實作:以 WebWorkflowRole 為例

     編輯:關於C++

前言

Windows Workflow Foundation (WF) 內建角色型權限控制,支援兩種角色提供者:ActiveDirectoryRole(Active Directory 整合)與 WebWorkflowRole(ASP.NET Role Provider)。本文以 WebWorkflowRole 為例,示範從資料庫設定、角色建立、流程定義到執行階段身分驗證的完整流程。

環境建置與設定

1. 安裝 ASP.NET 資料庫

執行 aspnet_regsql.exe 建立 aspnetdb 資料庫,包含角色、使用者等資料表。

2. App.config 設定


<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="SqlServerConnection"
         connectionString="IntegratedSecurity=SSPI;server=localhost\SQLExpress;database=aspnetdb" />
  </connectionStrings>
  <system.web>
    <roleManager enabled="true" defaultProvider="SqlProvider">
      <providers>
        <add name="SqlProvider"
             connectionStringName="SqlServerConnection"
             applicationName="ConsoleAppSample"
             type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </providers>
    </roleManager>
  </system.web>
</configuration>

角色與使用者建立

程式碼建立兩個角色並指派使用者:


private void CreateRoles() {
    // 人事角色
    if (!System.Web.Security.Roles.RoleExists("Personnel")) {
        System.Web.Security.Roles.CreateRole("Personnel");
        string[] users = { "Amanda", "Jones", "Simpson", "Peter" };
        string[] role = { "Personnel" };
        System.Web.Security.Roles.AddUsersToRoles(users, role);
    }
    
    // 部門經理角色
    if (!System.Web.Security.Roles.RoleExists("DeptManager")) {
        System.Web.Security.Roles.CreateRole("DeptManager");
        string[] users = { "Betty", "Chris", "Anil", "Derek" };
        string[] role = { "DeptManager" };
        System.Web.Security.Roles.AddUsersToRoles(users, role);
    }
}

流程定義與角色綁定

1. 定義流程角色集合

在 Workflow1.cs 中宣告公用變數:


public System.Workflow.Activities.WorkflowRoleCollection eaInitiators = 
    new System.Workflow.Activities.WorkflowRoleCollection();

2. 將角色加入流程


// 裝載部門經理角色
WebWorkflowRole eaInitiatorsRole = new WebWorkflowRole("DeptManager");
eaInitiators.Add(eaInitiatorsRole);

執行階段身分驗證

啟動流程時,將登入使用者身分傳入:


// 建立泛型身分識別(以 Betty 為例)
System.Security.Principal.GenericIdentity genIdentity = 
    new System.Security.Principal.GenericIdentity("Betty");

// 透過外部事件活動將身分傳入流程
// 假設 externalEventActivity 為定義好的 ExternalDataExchangeActivity
externalEventEventArgs.Identity = genIdentity;
// 觸發事件啟動流程

權限檢查機制

WF 執行引擎會自動檢查:

  1. 取得傳入的 GenericIdentity 名稱("Betty")
  2. 查詢 ASP.NET Role Provider 取得該使用者所屬角色
  3. 比對流程定義的 WorkflowRoleCollection(此例為 "DeptManager")
  4. 若使用者具備對應角色,允許啟動/執行流程;否則拒絕存取

完整流程圖解

[資料庫 aspnetdb] ←→ [ASP.NET Role Provider] ←→ [WebWorkflowRole]
                                                         ↓
[App.config 設定] → [CreateRoles() 建立角色/用戶] → [WorkflowRoleCollection]
                                                         ↓
[執行階段] → [GenericIdentity("Betty")] → [ExternalDataExchange] → [WF Runtime]
                                                         ↓
                                            [自動比對角色權限] → [允許/拒絕執行]

關鍵類別對照表

類別命名空間用途
WebWorkflowRoleSystem.Workflow.Activities包裝 ASP.NET 角色供 WF 使用
WorkflowRoleCollectionSystem.Workflow.Activities流程定義的角色清單
SqlRoleProviderSystem.Web.Security資料庫角色存取提供者
GenericIdentitySystem.Security.Principal執行階段使用者身分
RolesSystem.Web.Security角色管理靜態類別

注意事項

  • applicationName 需與資料庫記錄一致,否則角色查詢會失敗
  • 角色名稱區分大小寫,建立與參考時需完全一致
  • 生產環境建議使用 Windows 整合驗證(IntegratedSecurity=SSPI)
  • 流程定義的角色集合必須為 public 以便執行階段存取

總結

透過 WebWorkflowRole 整合 ASP.NET Role Provider,WF 能以最少程式碼實現企業級角色型存取控制(RBAC)。核心步驟:設定 Provider → 建立角色/用戶 → 定義流程角色集合 → 執行時傳入身分 → WF 自動驗證。此架構支援靈活的角色管理,適合企業應用系統的工作流程權限控管。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved