[WCF权限控制]基于Windows用户组的授权方式[下篇]
2011-07-02 22:58
691 查看
为了让读者对基于Windows用户组的授权具有深刻的认识,接下来我们通过一个简单的事例来讲解在真正的应用中该授权模式如何使用。对于接下来演示的事例,我们将采用Windows认证和授权。至于授权的最终实现,我们采用的是在服务方法上面应用PrincipalPermissionAttribute特性方式的声明式授权。[源代码从这里下载]
在实例解决方案的整个结构建立之后,我们分别在Contracts和Services项目中定义服务契约接口和服务类型。下面是契约接口ICalculator和服务CalculatorService的定义。而在CalculatorService类的Add方法中应用了PrincipalPermissionAttribute特性,并将Roles属性设置成了Adminstrators,意味着该服务操作只能被管理员用户组中的用户调用。
ICalculator:
[/code]
CalculatorService:
[/code]
[/code]
而服务寄宿的程序依然简洁如故,仅仅包括正对寄宿服务类型的ServiceHost的创建和开启而已。
[/code]
[/code]
下面演示了完整的客户端程序和响应的配置。整个程序体现了两次针对相同服务操作的调用,而两次服务调用采用的客户端凭证分别是基于之前创建的两个Windows帐号Foo和Bar。
客户端程序:
[/code]
配置:
[/code]
由于调用的服务操作需要具有管理员权限采用调用,所以以Foo名义进行调用是没有为题的,但是对于帐号Bar,由于权限不足将会调用失败。而客户端输出的结果反映了这一点。
[/code]
注: 对于这个事例演示来说,服务操作只有具有管理员权限方能被正常调用。虽然我们创建的Windows帐号Foo在管理员用户组中,但是如果你使用Vista、Windows Server 2008和Windows 7这三种操作系统,在UAC开启的情况下,即使你以管理员运行我们的演示程序,Foo也不具有管理员权限。所以,你需要关闭UAC采用得到正确的执行结果,否则两次调用都是输出“服务调用失败...”。
[WCF权限控制]基于Windows用户组的授权方式[上篇]
[WCF权限控制]基于Windows用户组的授权方式[下篇]
目录:
步骤一、创建测试帐号
步骤二、创建服务契约和服务
步骤三、寄宿服务
步骤四、创建客户端程序
步骤一、创建测试帐号
步骤二、创建服务契约和服务
步骤三、寄宿服务
步骤四、创建客户端程序
步骤一、创建测试帐号
在创建事例解决方案之前我们先完成相应的准备工作,创建两个测试用的Windows帐号。假设两个帐号的名称分别为Foo和Bar,密码为Password。然后将帐号Foo添加到管理员(Administrators)用户组中。步骤二、创建服务契约和服务
我们依然沿用我们再熟悉不过的计算服务的例子,解决方案依然按照如下图所示的结构来设计。整个解决方式包括四个项目:Contracts、Services、Hosting和Client。对于这样的结构我们已经了解得够多了,在这里没有必要再赘言叙述了。在实例解决方案的整个结构建立之后,我们分别在Contracts和Services项目中定义服务契约接口和服务类型。下面是契约接口ICalculator和服务CalculatorService的定义。而在CalculatorService类的Add方法中应用了PrincipalPermissionAttribute特性,并将Roles属性设置成了Adminstrators,意味着该服务操作只能被管理员用户组中的用户调用。
ICalculator:
[code] using System.ServiceModel; namespace Artech.WcfServices.Contracts { [ServiceContract(Namespace = "http://www.artech.com/")] public interface ICalculator { [OperationContract] double Add(double x, double y); } }
[/code]
CalculatorService:
[code] using System.Security.Permissions; using Artech.WcfServices.Contracts; namespace Artech.WcfServices.Services { public class CalculatorService : ICalculator { [PrincipalPermission(SecurityAction.Demand, Role = "Administrators")] public double Add(double x, double y) { return x + y; } } }
[/code]
步骤三、寄宿服务
现在通过Hosting这个控制台程序对上面创建的服务进行寄宿。下面给出的是整个寄宿程序的配置。从该配置我们可以看到,服务唯一的终结点采用的绑定类型为WS2007HttpBinding。而在默认的情况下,WS2007HttpBinding采用Message安全模式和Windows认证方式。此外,基于UseWindowsGroups安全主体权限模式的ServiceAuthorization服务行为被应用到了该服务上。[code] <?xml version="1.0"?> <configuration> <system.serviceModel> <services> <service name="Artech.WcfServices.Services.CalculatorService" behaviorConfiguration="useWindowsGroupsAuthorization"> <endpoint address="http://127.0.0.1/calculatorservice" binding="ws2007HttpBinding" contract="Artech.WcfServices.Contracts.ICalculator"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name="useWindowsGroupsAuthorization"> <serviceAuthorization principalPermissionMode="UseWindowsGroups"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
[/code]
而服务寄宿的程序依然简洁如故,仅仅包括正对寄宿服务类型的ServiceHost的创建和开启而已。
[code] using System.ServiceModel; using Artech.WcfServices.Services; using System; namespace Artech.WcfServices.Hosting { public class Program { static void Main(string[] args) { using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) { host.Open(); Console.Read(); } } } }
[/code]
步骤四、创建客户端程序
来到整个实例的最后一个步骤,我们将服务调用的客户程序定义在Client项目中。整个实例演示的目的在于确认针对服务操作Add的授权根据Windows用户组进行的,我们只需要关注被授权的服务操作是否被成功调用。为此,我写了如下一个简单的辅助性的方法Invoke。如果服务操作被成功执行,输出“服务调用成功”,如果抛出异常则输出“服务调用失败”。[code] static void Invoke(ICalculator calculator) { try { calculator.Add(1,2); Console.WriteLine("服务调用成功..."); } catch (Exception ex) { Console.WriteLine("服务调用失败..."); } }
[/code]
下面演示了完整的客户端程序和响应的配置。整个程序体现了两次针对相同服务操作的调用,而两次服务调用采用的客户端凭证分别是基于之前创建的两个Windows帐号Foo和Bar。
客户端程序:
[code] using System.Net; using System.ServiceModel; using Artech.WcfServices.Contracts; namespace Artech.WcfServices.Clients { class Program { static void Main(string[] args) { ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorService"); NetworkCredential credential = channelFactory.Credentials.Windows.ClientCredential; credential.UserName = "Foo"; credential.Password = "Password"; ICalculator calculator = channelFactory.CreateChannel(); Invoke(calculator); channelFactory = new ChannelFactory<ICalculator>("calculatorService"); credential = channelFactory.Credentials.Windows.ClientCredential; credential.UserName = "Bar"; credential.Password = "Password"; calculator = channelFactory.CreateChannel(); Invoke(calculator); Console.Read(); } } }
[/code]
配置:
[code] <?xml version="1.0"?> <configuration> <system.serviceModel> <client> <endpoint name="calculatorService" address="http://127.0.0.1/calculatorservice" binding="ws2007HttpBinding" contract="Artech.WcfServices.Contracts.ICalculator"/> </client> </system.serviceModel> </configuration>
[/code]
由于调用的服务操作需要具有管理员权限采用调用,所以以Foo名义进行调用是没有为题的,但是对于帐号Bar,由于权限不足将会调用失败。而客户端输出的结果反映了这一点。
[code] 服务调用成功... 服务调用失败...
[/code]
注: 对于这个事例演示来说,服务操作只有具有管理员权限方能被正常调用。虽然我们创建的Windows帐号Foo在管理员用户组中,但是如果你使用Vista、Windows Server 2008和Windows 7这三种操作系统,在UAC开启的情况下,即使你以管理员运行我们的演示程序,Foo也不具有管理员权限。所以,你需要关闭UAC采用得到正确的执行结果,否则两次调用都是输出“服务调用失败...”。
[WCF权限控制]基于Windows用户组的授权方式[上篇]
[WCF权限控制]基于Windows用户组的授权方式[下篇]
相关文章推荐
- [WCF权限控制]基于Windows用户组的授权方式[上篇]
- [WCF权限控制]基于Windows用户组的授权方式
- WCF寄宿IIS的asp.net 服务 基于Windows用户组的授权方式
- [WCF权限控制]ASP.NET Roles授权[下篇]
- [WCF权限控制]ASP.NET Roles授权[下篇]
- [WCF权限控制]WCF的三种授权模式
- [WCF权限控制]利用WCF自定义授权模式提供当前Principal[原理篇]
- mongoDB在windows下基于配置文件的安装和权限配置方式
- [WCF权限控制]利用WCF自定义授权模式提供当前Principal[实例篇]
- 利用Windows Group实现基于角色的WCF接口方法调用授权
- java项目权限控制的理解和示例(基于shiro和传统拦截器filter两种方式)
- [WCF权限控制]ASP.NET Roles授权[上篇]
- [WCF权限控制]通过扩展自行实现服务授权[提供源码下载]
- [WCF权限控制]从两个重要的概念谈起:Identity与Principal[下篇]
- [WCF权限控制]ASP.NET Roles授权[上篇]
- 尝试asp.net mvc 基于controller action 方式权限控制方案可行性
- [WCF权限控制]WCF自定义授权体系详解[原理篇]
- [WCF权限控制]通过扩展自行实现服务授权
- Shiro入门之二 --------基于注解方式的权限控制与Ehcache缓存
- [WCF权限控制]WCF自定义授权体系详解[实例篇]