利用Windows Group实现基于角色的WCF接口方法调用授权
2008-08-21 22:36
676 查看
在现实的场景中,WCF Service Contract公开的接口方法往往要求指定的用户群体才能访问,WCF框架提供了对于Role-Based授权支持, WCF支持AspNetWindowsTokenRoleProvider, SqlRoleProvider, AuthorizationStoreRoleProvider.
基于Windows Group的授权主要利用ASP.NET Role Provider中的AspNetWindowsTokeRoleProvider来实现,要求WCF 通过IIS Host,并且用户终端在Domain环境中.
实现步骤:
1. 配置WCF IIS Host使用Windows认证
可以在IIS Manager中直接设置WCF Application的认证方式,也可以通过web.config文件实现
<system.web>
<authentication mode="Windows"/>
</system.web>
2. 在web.config文件中启用RoleProvider
<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider"/>
与其它的Role Provider不同,WindowsTokeRoleProvider不需要单独声明,可以直接使用, 例如下面基于ADAM的Provider,则需要额外声明.
<roleManager enabled="true" defaultProvider="RoleManagerAzManADAMProvider"
cacheRolesInCookie="false">
<providers>
<add name="RoleManagerAzManADAMProvider" type="System.Web.Security.AuthorizationStoreRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, publicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADAMConnection" applicationName="yourApp"/>
</providers>
</roleManager>
3. 在Service Behaviors配置中设置授权
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceMetadata httpsGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
<serviceAuthorization principalPermissionMode="UseWindowsGroups" roleProviderName="AspNetWindowsTokenRoleProvider">
</serviceAuthorization>
</behavior>
</serviceBehaviors>
</behaviors>
4. 在服务代码中指定授权组
//指定特定帐户调用方法
[PrincipalPermission(SecurityAction.Demand, Name = @"domain/michael")]
public string GetCaller()
{
return OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
}
//指定管理员帐户才能访问的方法
[PrincipalPermission(SecurityAction.Demand, Role = @"Administrators")]
public string GetThreadIdentity()
{
return System.Threading.Thread.CurrentPrincipal.Identity.Name;
}
//指定特定业务组可以访问的方法
[PrincipalPermission(SecurityAction.Demand, Role = @"Resource Manager")]
public string GetWindowsIdentity()
{
return System.Security.Principal.WindowsIdentity.GetCurrent().Name;
}
通过上面四步,可实现对于WCF 方法调用授权控制,这个场景并非通用,对于局域网应用来讲,是个不错的选择,用户也可以自己实现Customer Role Provider从而利用SQL或XML方式实现授权。
对于非windows认证的用户,可以利用SqlRoleProvider来实现授权,结合Sql Membership也可以进行身份验证。我个人很喜欢AuthorizationStoreRoleProvider, 结合ADAM的强大功能,可以完美解决权限管理问题。
基于Windows Group的授权主要利用ASP.NET Role Provider中的AspNetWindowsTokeRoleProvider来实现,要求WCF 通过IIS Host,并且用户终端在Domain环境中.
实现步骤:
1. 配置WCF IIS Host使用Windows认证
可以在IIS Manager中直接设置WCF Application的认证方式,也可以通过web.config文件实现
<system.web>
<authentication mode="Windows"/>
</system.web>
2. 在web.config文件中启用RoleProvider
<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider"/>
与其它的Role Provider不同,WindowsTokeRoleProvider不需要单独声明,可以直接使用, 例如下面基于ADAM的Provider,则需要额外声明.
<roleManager enabled="true" defaultProvider="RoleManagerAzManADAMProvider"
cacheRolesInCookie="false">
<providers>
<add name="RoleManagerAzManADAMProvider" type="System.Web.Security.AuthorizationStoreRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, publicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADAMConnection" applicationName="yourApp"/>
</providers>
</roleManager>
3. 在Service Behaviors配置中设置授权
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceMetadata httpsGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
<serviceAuthorization principalPermissionMode="UseWindowsGroups" roleProviderName="AspNetWindowsTokenRoleProvider">
</serviceAuthorization>
</behavior>
</serviceBehaviors>
</behaviors>
4. 在服务代码中指定授权组
//指定特定帐户调用方法
[PrincipalPermission(SecurityAction.Demand, Name = @"domain/michael")]
public string GetCaller()
{
return OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
}
//指定管理员帐户才能访问的方法
[PrincipalPermission(SecurityAction.Demand, Role = @"Administrators")]
public string GetThreadIdentity()
{
return System.Threading.Thread.CurrentPrincipal.Identity.Name;
}
//指定特定业务组可以访问的方法
[PrincipalPermission(SecurityAction.Demand, Role = @"Resource Manager")]
public string GetWindowsIdentity()
{
return System.Security.Principal.WindowsIdentity.GetCurrent().Name;
}
通过上面四步,可实现对于WCF 方法调用授权控制,这个场景并非通用,对于局域网应用来讲,是个不错的选择,用户也可以自己实现Customer Role Provider从而利用SQL或XML方式实现授权。
对于非windows认证的用户,可以利用SqlRoleProvider来实现授权,结合Sql Membership也可以进行身份验证。我个人很喜欢AuthorizationStoreRoleProvider, 结合ADAM的强大功能,可以完美解决权限管理问题。
相关文章推荐
- 微信公众账号利用post方法调用接口实现方法
- 关于Java中Scanner对象的hasNext()方法对实现Readable接口的对象中的read()方法调用的探讨
- 基于MQTT+WCF 实现Web 接口转即时服务
- 利用JAVA反射机制实现调用私有方法
- python利用字典保存配置实现动态调用模块类方法
- 利用JNI在vs2010上实现c++调用Java类方法
- 1)编写Animal接口,接口中声明run()方法; 2)定义Bird类和Fish类实现Animal接口; 3)编写Bird类和Fish类的测试程序,并调用其中的run()方法
- 利用JAVA反射机制实现调用私有方法
- dll动态链接库之用类写配置文件和调用判断方法接口的实现中遇到的若干问题
- 通过dubbo暴露接口调用方法,及基于zookeeper的dubbo涉及配置文件【转】
- VB.NET,C#.NET调用Web Service,利用visual studio 的实现方法
- 【转】利用ScriptManager实现Javascript调用WebService中的方法
- 【廖雪峰 python教程 课后题 切片】利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:
- [WCF权限控制]基于Windows用户组的授权方式
- C#利用反射调用基类私有方法 及 Unity实现自定义InputField
- 基于Restful接口的网络API接口调用方法
- 通过dubbo暴露接口调用方法,及基于zookeeper的dubbo涉及配置文件【转】
- 在springmvc中非controller类中调用service接口,以获取springmvc容器方法实现
- 利用IContextMenu接口实现Windows外壳的上下文菜单操作
- 定义一个接口,再定义类实现该接口,编写应用程序,调用接口中的 3 个方法,并将调用方法所得的结果输出。