Windows Workflow Foundation (WF) 內建角色型權限控制,支援兩種角色提供者:ActiveDirectoryRole(Active Directory 整合)與 WebWorkflowRole(ASP.NET Role Provider)。本文以 WebWorkflowRole 為例,示範從資料庫設定、角色建立、流程定義到執行階段身分驗證的完整流程。
執行 aspnet_regsql.exe 建立 aspnetdb 資料庫,包含角色、使用者等資料表。
<?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);
}
}
在 Workflow1.cs 中宣告公用變數:
public System.Workflow.Activities.WorkflowRoleCollection eaInitiators =
new System.Workflow.Activities.WorkflowRoleCollection();
// 裝載部門經理角色
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 執行引擎會自動檢查:
GenericIdentity 名稱("Betty")WorkflowRoleCollection(此例為 "DeptManager")
[資料庫 aspnetdb] ←→ [ASP.NET Role Provider] ←→ [WebWorkflowRole]
↓
[App.config 設定] → [CreateRoles() 建立角色/用戶] → [WorkflowRoleCollection]
↓
[執行階段] → [GenericIdentity("Betty")] → [ExternalDataExchange] → [WF Runtime]
↓
[自動比對角色權限] → [允許/拒絕執行]
| 類別 | 命名空間 | 用途 |
|---|---|---|
| WebWorkflowRole | System.Workflow.Activities | 包裝 ASP.NET 角色供 WF 使用 |
| WorkflowRoleCollection | System.Workflow.Activities | 流程定義的角色清單 |
| SqlRoleProvider | System.Web.Security | 資料庫角色存取提供者 |
| GenericIdentity | System.Security.Principal | 執行階段使用者身分 |
| Roles | System.Web.Security | 角色管理靜態類別 |
applicationName 需與資料庫記錄一致,否則角色查詢會失敗IntegratedSecurity=SSPI)public 以便執行階段存取透過 WebWorkflowRole 整合 ASP.NET Role Provider,WF 能以最少程式碼實現企業級角色型存取控制(RBAC)。核心步驟:設定 Provider → 建立角色/用戶 → 定義流程角色集合 → 執行時傳入身分 → WF 自動驗證。此架構支援靈活的角色管理,適合企業應用系統的工作流程權限控管。