我们正在尝试创建一个只能由指定的 Windows 组访问的 WCF 服务。如何在服务器 web.config 和客户端配置中进行配置?
注意:我们希望能够控制允许在服务器 web.config 中访问的 Windows 组,而不是在代码中。此外,我们根本不需要/不需要 SSL。
我用谷歌搜索,然后我能找到的最好的例子都是这样的......
但这并不能解释如何将访问权限仅限于特定组或组。
我们正在尝试创建一个只能由指定的 Windows 组访问的 WCF 服务。如何在服务器 web.config 和客户端配置中进行配置?
注意:我们希望能够控制允许在服务器 web.config 中访问的 Windows 组,而不是在代码中。此外,我们根本不需要/不需要 SSL。
我用谷歌搜索,然后我能找到的最好的例子都是这样的......
但这并不能解释如何将访问权限仅限于特定组或组。
如果这是 Intranet 应用程序,您可以使用 netTcpBinding:
<services>
<service name="YourService"
behaviorConfiguration="YourServiceBehavior">
<endpoint
binding="netTcpBinding"
bindingConfiguration="SecureTransportWindows"
contract="YourContract" />
</service>
</services>
<bindings>
<binding name="SecureTransportWindows">
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="YourServiceBehavior">
<serviceAuthorization principalPermissionMode="UseWindowsGroups" />
</behavior>
</serviceBehaviors>
</behaviours>
然后在服务代码中你可以要求 windows 角色:
class YourService : YourContract
{
[PrincipalPermission(SecurityAction.Demand, Role="MYDOMAIN\Administrators")]
public string SecuredOperation(string name)
{
return "secured operation";
}
}
如果您需要在配置中设置它,那么您必须实现自定义授权:
<behavior name="YourServiceBehavior">
<serviceAuthorization principalPermissionMode="Custom">
<authorizationPolicies>
<add policyType="YourCustomAuthorizationPolicy"/>
</authorizationPolicies>
</serviceAuthorization>
</behavior>
并在代码中实现 IAuthorizationPolicy 接口:
public class YourCustomAuthorizationPolicy : IAuthorizationPolicy
{
//you need to check msdn
}
好的,这就是我们想出的解决方案。尽管它确实涉及代码更改(添加 AspNetCompatibilityRequirements 属性),但我们现在可以在 web.config 文件中实现组/角色的配置,而不是硬编码。
这有很多步骤...
1) 将aspNetCompatibilityEnabled属性添加到 serviceHostingEnvironment 元素中并设置为 true,例如...
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
这告诉 WCF 服务在 ASP.NET 兼容模式下运行并完全参与 ASP.NET HTTP 请求生命周期。有关完整详细信息,请参阅此 MSDN 文章。
2) 在 WCF 代码中,按照上面的链接和本 MSDN 文章中的规定,将AspNetCompatibilityRequirements属性添加到服务类...
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)>
3)现在我们可以添加通常的 ASP授权元素来限制对指定组/用户的访问(没有上面的设置(1)和(2),这将被 WCF 忽略)...
<system.web>
<authorization>
<allow roles="MYDOMAIN\WCFAuthenticatedUsers" /> <-- allows access to users in this group
<deny users="*" /> <-- denies access to all other users
</authorization>
</system.web>