溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

在Workflow工作流中怎么使用角色

發(fā)布時間:2021-11-03 10:18:54 來源:億速云 閱讀:138 作者:小新 欄目:編程語言

這篇文章主要介紹在Workflow工作流中怎么使用角色,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

WF(Workflow)中提供來兩種方式:ActiveDirectoryRole(通過活動目錄用戶)和WebWorkflowRole(ASP.NET Role)。下面舉例說明:

1.我們使用HandleExternalEventActivity活動來提供圖書檢索功能,當有人檢索的時候會觸發(fā)檢索事件,只有會員才可以使用該功能。首先來定義事件參數(shù):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Workflow.Activities;

namespace CaryWFRole
{
    [Serializable]
    public class BookEventArgs : ExternalDataEventArgs
    {
        public string ID { get; set; }
        public string Name { get; set; }
        public string Author { get; set; }

        public BookEventArgs()
            : base(Guid.NewGuid())
        { }

        public BookEventArgs(Guid instanceID, string id, string name, string author)
            : base(instanceID)
        {
            this.ID = id;
            this.Name = name;
            this.Author = author;
        }
    }
}

2.事件接口如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Workflow.Activities;

namespace CaryWFRole
{
    [ExternalDataExchangeAttribute()]
    public interface ISearchBookService
    {
        event EventHandlerSearchBook;
    }
}

3.實現(xiàn)該接口,代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Principal;

namespace CaryWFRole
{
    public class SearchBookService:ISearchBookService
    {
        public event EventHandlerSearchBook;

        public void OnSearchRequest(Guid instanceId, string id,string name,string author, IIdentity identity)
        {
            BookEventArgs args = new BookEventArgs(instanceId, id, name, author);
            String securityIdentifier = null;
            WindowsIdentity windowsIdentity = identity as WindowsIdentity;

            if (windowsIdentity != null && windowsIdentity.User != null)
                securityIdentifier = windowsIdentity.User.Translate(typeof(NTAccount)).ToString();
            else if (identity != null)
                securityIdentifier = identity.Name;

            args.Identity = securityIdentifier;
            Console.WriteLine("return book by: {0}", identity.Name);

            if (SearchBook != null)
                SearchBook(null, args);
        }
    }
}

4.工作流設(shè)計如下:

在Workflow工作流中怎么使用角色

通過設(shè)置檢索事件(HandleExternalEventActivity)活動的的Roles屬性來控制,只有該角色集合的用戶才有權(quán)限。在工作流中我們只允許會員才可以做
檢索,代碼如下:

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Linq;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;

namespace CaryWFRole
{
    public sealed partial class BookWorkflow : SequentialWorkflowActivity
    {
        public BookWorkflow()
        {
            InitializeComponent();
        }

        private WorkflowRoleCollection sAllowRoles = new WorkflowRoleCollection();

        public WorkflowRoleCollection AllowRoles
        {
            get { return sAllowRoles; }
        }

        private void codeActivity1_ExecuteCode(object sender, EventArgs e)
        {
            WebWorkflowRole role = new WebWorkflowRole("會員");
            AllowRoles.Add(role);
        }

        private void handleExternalEventActivity1_Invoked(object sender, ExternalDataEventArgs e)
        {
            Console.WriteLine("查詢成功");
        }
    }
}

5.通過如下函數(shù)來創(chuàng)建角色和用戶,代碼如下:

static void CreateRoles()
{
     if (!System.Web.Security.Roles.RoleExists("會員"))
     {
         System.Web.Security.Roles.CreateRole("會員");
         string[] users = { "張三", "李四", "王五" };
         string[] ClerkRole = { "會員" };
         System.Web.Security.Roles.AddUsersToRoles(users, ClerkRole);
     }           
}

6.假設(shè)以張三的身份來檢索,觸發(fā)事件的函數(shù)如下:

static void SendSearchRequest()
{
       try
       {                
            string id = "001";
            string name = "C#高級編程";
            string author = "某某某";
                
            GenericIdentity genIdentity = new GenericIdentity("張三");
            sBook.OnSearchRequest(workflowInstanceId, id, name, author, genIdentity);
       }
       catch (Exception e)
       {
            Console.WriteLine("Exception message: {0}", e.ToString());
       }
}

7.宿主程序如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
using System.Security.Principal;
using System.Workflow.Activities;

namespace CaryWFRole
{
    class Program
    {
        static SearchBookService sBook;
        static Guid workflowInstanceId;
        static AutoResetEvent waitHandle = new AutoResetEvent(false);

        static void Main()
        {
            CreateRoles();
            using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
            {
                workflowRuntime.StartRuntime();
                Type type = typeof(BookWorkflow);
                ExternalDataExchangeService dataService = new ExternalDataExchangeService();
                workflowRuntime.AddService(dataService);

                sBook = new SearchBookService();
                dataService.AddService(sBook);

                workflowRuntime.WorkflowCompleted += OnWorkflowCompleted;
                workflowRuntime.WorkflowTerminated += OnWorkflowTerminated;

                WorkflowInstance instance = workflowRuntime.CreateWorkflow(type);
                workflowInstanceId = instance.InstanceId;
                instance.Start();
                SendSearchRequest();
                waitHandle.WaitOne();
                workflowRuntime.StopRuntime();
            }
        }

        static void OnWorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
        {
            waitHandle.Set();
        }
        static void OnWorkflowTerminated(object sender, WorkflowTerminatedEventArgs e)
        {
            Console.WriteLine(e.Exception.Message);
            waitHandle.Set();
        }
    }
}

8.我們要配置aspnetdb數(shù)據(jù)庫,app.config如下:

<?xml version="1.0" encoding="utf-8" ?>
<CONFIGURATION>
<CONNECTIONSTRINGS>
<ADD name="SqlServerConnection" connectionString="Integrated Security = SSPI;server=.;database=aspnetdb" />
</CONNECTIONSTRINGS>
<SYSTEM.WEB>
<ROLEMANAGER defaultProvider="SqlProvider" enabled="true">
<PROVIDERS>
<ADD name="SqlProvider" type="System.Web.Security.SqlRoleProvider, &#13;&#10;                System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" applicationName="ConsoleAppSample" connectionStringName="SqlServerConnection" />
</PROVIDERS>
</ROLEMANAGER>
</SYSTEM.WEB>
</CONFIGURATION>

以上是“在Workflow工作流中怎么使用角色”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI