模拟在WCF中的应用

在《模拟(Impersonation)与委托(Delegation)》一文中,我们对模拟和委托这两个概念以及相关编程实现进行了详细说明。如果将模拟使用在WCF上面,就意味着WCF可以模拟客户端身份(而不是启动寄宿进程的Windows帐号)执行服务操作。这篇文章主要介绍WCF关于模拟的编程。

一、命令式模拟编程

如果我们有一个具有模拟级别为Impersonation或者Delegation的WindowsIdentity,我们就可以通过调用其Impersonate对其进行身份模拟。在采用WCF认证的情况下,我们可以通过当前ServiceSecurityContext的WindowsIdentity或者PrimaryIdentity获取到代码认证客户端的WindowsIdentity对象,那么在服务操作中模拟客户端身份就和简单了。这种在服务操作实现中通过编程的方式实现身份模式可以将服务操作的部分逻辑在模拟的客户端身份下执行。

   1: using (WindowsImpersonationContext context = ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
   2: {
   3:     //在模拟上下文中执行的操作
   4: }

二、声明式模拟编程

如果你希望整个操作都在模拟上下文中执行,你可以采用声明式的模拟编程。具体来说,你只需要在需要进行模拟的服务操作方法上应用OperationBehaviorAttribute特性,并指定相应的模拟选项即可。

   1: [AttributeUsage(AttributeTargets.Method)]
   2: public sealed class OperationBehaviorAttribute : Attribute, IOperationBehavior
   3: {
   4:     //其他成员
   5:     public ImpersonationOption Impersonation { get; set; }
   6: }
   7: public enum ImpersonationOption
   8: {
   9:     NotAllowed,
  10:     Allowed,
  11:     Required
  12: }

通过OperationBehaviorAttribute的Impersonation属性指定模拟选项通过枚举ImpersonationOption表示。定义在ImpersonationOption的三个枚举项NotAllowed、Allowed和Required分别表示的含义如下。

  • NotAllowed:不允许模拟客户端身份,这是默认值;
  • Allowed:在身份模拟条件满足条件允许模拟客户端身份;
  • Required:强制模拟客户端身份。这要求强制采用Windows认证,如果采用非Windows认证,会抛出异常。

此外,如果你要求服务的所有操作均强制采用身份模拟,你可以通过编程或者配置将ServiceAuthorizationBehavior的ImpersonateCallerForAllOperations属性设置成true。但是在这种情况下,如果该服务具有任何模拟选项被设置成NotAllowed的服务操作,服务在寄宿过程中会抛出InvalidationOperationException异常。

   1: public sealed class ServiceAuthorizationBehavior : IServiceBehavior
   2: {   
   3:     //其他成员
   4:     public bool ImpersonateCallerForAllOperations { get; set; }
   5: }

三、设置模拟级别

在采用Windows认证的情况下,服务可以在成功认证后可以获取代表客户端身份的WindowsIdentity对象。但是服务端是否可以根据WindowsIdentity获取客户端身份信息,是否可以模拟客户端身份访问某些安全资源,这取决于该WindowsIdentity的模拟级别。

身份模拟密切地关系到被模拟身份代表的用户的安全,所以模拟级别应该通过客户端自行控制。在WCF安全体系中,该模拟级别是在客户端提供的Windows凭证中指定。如下面的代码所示,表示客户端Windows凭证的WindowsClientCredential类型中,具有一个类型为TokenImpersonationLevel枚举的AllowedImpersonationLevel属性,用以指定模拟级别。该属性的默认值为None,实际上代表的等级是Identification。

   1: public sealed class WindowsClientCredential
   2: {
   3:     //其他成员
   4:     public TokenImpersonationLevel AllowedImpersonationLevel { get; set; }
   5: }

作者:蒋金楠
微信公众账号:大内老A
微博:www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文链接

时间: 2025-01-25 16:29:41

模拟在WCF中的应用的相关文章

我的WCF之旅(3):在WCF中实现双向通信(Bi-directional Communication)

昨天写了一篇Remoting中如何实现双向通信的文章<[原创].NET Remoting: 如何通过Remoting实现双向通信(Bidirectional Communication) >,作为对比,今天我们来讨论一下WCF的双向通信. 为了使我们能够更好地对比双向通信在Remoting中和WCF中的实现,我们的Sample采用一样的业务逻辑--调用一个数学计算的远程调用,除了传递相应的操作数之外,我们还传递一个对象,这个对象可以在Server端中回调 (Callback) 把运算结果在Cl

[WCF安全系列]实例演示:TLS/SSL在WCF中的应用[SSL over TCP]

在接下来的系列文章中我们正是讨论关于身份认证的主题.在前面我们已经谈到了,WCF中的认证属于"双向认证",既包括服务对客户端的认证(以下简称客户端认证),也包括客户端对服务的认证(以下简称服务认证).客户端认证和服务认证从本质上并没有什么不同,无非都是被认证一方提供相应的用户凭证供对方对自己的身份进行验证.我们先来讨论服务认证,客户端认证放在后续的文章中. 在<从两种安全模式谈起>中,我们对TLS/SSL进行了简单的介绍.我们知道,客户端和服务在为建立安全上下文而进行的协商

在 WCF 中使用高效的 BinaryFormatter 序列化

本文将定义一个 WCF 终结点行为扩展,以在 WCF 中使用更高效的 BinaryFormatter 进行二进制序列化,并实现对是否使用传统二进制序列化功能的可配置. 介绍 实现步骤 使用方法 效果   介绍 在 OEA 框架中,是使用 WCF 作为数据传输框架.但是使用 WCF 内部的二进制序列化,序列化后的数据大小,要比使用传统的 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 类进行序列化后的数据大小要大得多.作

WCF技术剖析之十一:异步操作在WCF中的应用(下篇)

说完了客户端的异步服务调用(参阅WCF技术剖析之十一:异步操作在WCF中的应用(上篇)),我们在来谈谈服务端如何通过异步的方式为服务提供实现.在定义服务契约的时候,相信大家已经注意到了OperationContractAttribute特性具有一个bool类型的AsynPattern.该属性可以将一个服务操作定义成异步实现模式,接下来的内容主要是着眼于介绍异步操作的定义和实现原理. 一.异步操作的定义和实现原理 实现WCF异步服务操作模式在编程上具有一些限制:异步服务操作是通过两个配对的方法实现

WCF技术剖析之十一:异步操作在WCF中的应用(上篇)

按照操作执行所需的资源类型,我们可以将操作分为CPU绑定型(CPU Bound)操作和I/O绑定型(I/O Bound)操作.对于前者,操作的执行主要利用CPU进行密集的计算,而对于后者,大部分的操作处理时间花在I/O操作处理,比如访问数据库.文件系统.网络资源等.对于I/O绑定型操作,我们可以充分利用多线程的机制,让多个操作在自己的线程并发执行,从而提高系统性能和响应能力.服务调用就是典型的I/O绑定型操作,所以多线程在服务调用中具有广泛的应用.在本篇文章中,我们专门来讨论多线程或者是异步操作

WCF中的REST架构二 (支持AJAX的WCF服务

我在昨天的文章WCF中的REST架构一(REST 概述)谈了REST的基本概要,并提出了从HI REST (高REST)到 LO REST (低REST) 的RESTFULness(REST度)的概念.在今天的文章中,我将详细介绍大家可能最为熟悉的REST风格的WCF 服务:支持AJAX的服务.此类服务应属于LO REST的范畴.现在很多人直觉地将"好"等同于"高大全",因而低估了这种LO REST实现的价值.本篇将告诉你这决非事实,支持AJAX的WCF服务是足够强

谈谈WCF中的Data Contract(3)

谈谈WCF中的Data Contract(3):WCF Data Contract对Collection & Dictionary的支持 在本篇文章上一部分Order Processing的例子中,我们看到原本已Collection形式定义的DetailList属性(public IList<TDetail> DetailList),在Data Contract中却以Array的方式体现(public OrderDetail[] DetailList).我们现在就来详细地讨论一下基于C

谈谈WCF中的Data Contract (1):Data Contract Overview

Contract in SO:Contract是对操作和数据的抽象 在我们看来,Service Orientation提供了一种对业务.功能进行分解的方式.针对SO,我们把一个具体的业务流程或者一个复杂的功能分解成一个个独立完成某项任务的子单元,这些子单元通过一个个Service来承载.对于Service本身来讲,他们应该是自治的,独自完成自己的功能.不依赖于其他的Service.但是Service的价值体现在它被潜在的消费者使用的程度.这实际上包含两方面的内容,作为Service本身,它如何将

我的WCF之旅(9):如何在WCF中使用tcpTrace来进行Soap Trace

无论对于Web Service还是WCF,Client和Service之间交互的唯一形式是通过发送和接收Soap Message.在我们对Web Service和WCF进行深入学习的时候,借助一些Soap Trace 工具对Soap Message进行深入剖析是非常有必要的.在这些工具之中,我觉得最好用的就是Microsoft Soap Toolkit中的Soap Trace Utility和tcpTrace.我们今天就来讲讲如何在WCF中使用tcpTrace这个工具. 首先我们来讲讲tcpTr