`

在WF中使用角色

阅读更多

WF提供了一种用于对所有支持数据输入的活动的、基于角色的访问机制。工作流创建者可以完全控制如何创建角色和角色集合。这样将使创建者能够提供必
要的授权机制,在执行活动之前验证调用者的角色。比如WF中的WebServiceInputActivity 和 HandleExternalEventActivity活动。

WF中提供来两种方式:ActiveDirectoryRole(通过活动目录用户)和WebWorkflowRole(ASP.NET Role)。下面举例说明:

1.我们使用HandleExternalEventActivity活动来提供图书检索功能,当有人检索的时候会触发检索事件,只有会员才可以使用该功能。首先来定义事件参数:

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 EventHandler<BookEventArgs> SearchBook;
    }
}

3.实现该接口,代码如下:

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

namespace CaryWFRole
{
    public class SearchBookService:ISearchBookService
    {
        public event EventHandler<BookEventArgs> SearchBook;

        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.工作流设计如下:

image

通过设置检索事件(HandleExternalEventActivity)活动的的Roles属性来控制,只有该角色集合的用户才有权限。在工作流中我们只允许会员才可以做
检索,代码如下:

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.通过如下函数来创建角色和用户,代码如下:
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.假设以张三的身份来检索,触发事件的函数如下:
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数据库,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 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>

9.执行结果如下:
image 

分享到:
评论

相关推荐

    WF编程系列之基于角色的授权

    【WF编程系列之基于角色的授权】主要探讨的是在WF(Windows Workflow Foundation)框架下如何实现基于角色的授权,这是工作流系统中的一个重要概念,它涉及到权限管理、用户角色分配以及工作流执行过程中的访问控制...

    爱普生wf7111 wf7621维护软件,强力清洗清零软件

    爱普生WF-7111和WF-7621是两款常见的商务喷墨打印机,它们在办公室环境中被广泛使用,以提供高质量的打印、扫描、复印和传真功能。这些打印机采用爱普生的EcoTank技术,具有大容量墨水盒,降低了用户的打印成本。...

    WF design # rule set

    工作流在企业软件开发中扮演着重要角色,尤其在需要管理复杂业务流程的系统中,如ERP(企业资源规划)、CRM(客户关系管理)等。 压缩包内的两个文件名称: 1. "CON-TLC303_WF_DesignerReHosting.ppt" - 这个文件...

    一个利用WF4.0多书签模拟简单会签的例子

    本例子旨在演示如何使用WF4.0的多书签功能来模拟简单的会签过程,会签在业务流程中常见于多个参与者需要对同一份文档或请求进行审批的情况。 会签过程通常涉及多个步骤和角色,每个角色都需要查看、评估并批准或...

    爱普生EPSON WF2650+WF2660+WF2750+WF2760清零软件+使用说明.zip

    清零软件在打印机领域中扮演着重要的角色。爱普生打印机的清零过程通常涉及到墨盒计数器和废墨垫计数器的重置。墨盒计数器跟踪墨盒的使用情况,当其达到一定数值时,打印机可能会提示更换墨盒,即使墨盒仍有余墨。...

    Windows工作流(WF .NET 3.5)

    工作流在软件工程中扮演着重要的角色,因为它可以帮助组织将复杂的业务逻辑和决策过程模型化。WF .NET 3.5 提供了多种工作流活动,如顺序流程、状态机流程、并行流程和交易流程等,这些活动可以组合起来构建出各种...

    web wf 设计器

    在本篇中,我们将深入探讨Web WF设计器的核心概念、功能以及其在IT领域的应用。 1. 工作流(Workflow)基础 工作流是指组织内部或跨组织的一系列任务和活动,按照预定的规则和顺序执行,以完成一项业务目标。WF...

    WF_WCF_Samples

    WF(Windows Workflow Foundation)和WCF(Windows Communication Foundation)是微软.NET Framework中的两个核心组件,它们在企业级应用开发中扮演着重要的角色。本压缩包"WF_WCF_Samples.exe"提供了一系列示例,...

    SICK WF Next槽型传感器 产品说明.rar

    综上所述,SICK的WF Next槽型传感器以其卓越的性能和广泛的应用场景,在工业自动化中扮演着不可或缺的角色。了解其特点和技术参数,结合实际应用需求进行选择和使用,将有助于提升生产效率和产品质量。

    WF4.0利用书签实现动态调子流程的例子

    书签在WF4.0中扮演着重要的角色,它允许工作流在执行到特定点时暂停,并在稍后恢复。这就像阅读一本书时放置的书签,标记了当前的进度。在工作流中,书签可以用来保存状态,以便于在需要时恢复执行,特别是在处理...

    WF财务审核源码(wpf)

    在这个系统中,WF可能被用来定义和自动化财务审批流程,例如,根据金额大小分配不同的审批级别,确保合规性和效率。工作流可以定义为一系列步骤,包括不同角色的审批、信息验证和任务分配,这些步骤可以根据业务规则...

    基于ASP.NET的工作流批核系统(.NET 3.5框架的WF技术实现)

    在这个系统中,WF将帮助我们创建、实例化、执行和监控工作流实例,以满足批核流程的需求。 在ASP.NET环境中集成WF,开发者可以通过设计工作流模型来描述批核过程。这通常包括定义活动(Activities),如“发起审批...

    WF从入门到精通

    WF在企业级应用开发中扮演着重要角色,尤其是在需要实现复杂业务流程的情况下。 - **应用场景**:WF可以应用于多种场景,比如审批流程管理、订单处理、发票审核等,通过WF技术可以极大地提高业务处理效率和准确性。...

    asp.net工作流 基于wf

    在ASP.NET环境中结合WF,可以创建动态、灵活且可扩展的Web应用程序,实现复杂的业务流程自动化。 标题中的"asp.net工作流 基于wf"指的是使用ASP.NET技术,利用WF框架来开发工作流应用程序。WF提供了一个抽象的模型...

    silverlight4 工作流wf 入门代码

    在这个示例中,可能会展示如何使用WCF服务来启动、管理和监控WF工作流,并且Silverlight客户端可以通过WCF接口与服务端工作流进行通信。 3. WF2Demo.rar:这可能是一个基于WF4(即WF的第四代版本)的示例,展示了WF...

    变频器说明书大全系列-WF2.rar

    变频器,全称是交流变频调速器...总之,"WF2.rar"中的WF2系列变频器说明书是理解和使用该系列变频器的重要参考资料,它将帮助用户从零开始学习如何配置、操作、维护和解决问题,确保变频器在各种工况下稳定高效地运行。

    易语言模块wf.rar

    通过创建类的实例(对象),用户可以在程序中使用这些类提供的功能。 3. **常量和变量**:模块中可能会定义一些全局常量和变量,这些变量在整个程序中都可访问,常量用于存储不会改变的值,变量则用于存储会变化的...

    WF工作流详细设计方案,WF工作流接口规范

    在WF工作流中,本地服务组件(Local Service)扮演关键角色,它定义了业务与工作流组件交互的接口,实现了两者间的通信。系统工作流引擎基于WF运行时,提供了持久化、可靠性和事务处理等功能,确保流程的顺利执行。...

Global site tag (gtag.js) - Google Analytics