7

我正在使用 WCF 服务和 net.tcp 端点,并将 serviceAuthentication 的主体 PermissionMode 设置为 UseWindowsGroups。

目前在服务的实现中,我使用 PrincipalPermission 属性来设置每个方法的角色要求。

        [PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]
        [OperationBehavior(Impersonation = ImpersonationOption.Required)]
        public string method1()

我正在尝试做几乎完全相同的事情,除了在 app.config 中设置角色的配置。有什么方法可以做到这一点并且仍然使用 Windows 组身份验证?

谢谢

4

3 回答 3

8

如果您在 IIS 中托管 WCF 服务,它将在 ASP.NET 工作进程中运行,这意味着您可以像使用 ASMX Web 服务一样配置身份验证和授权:

<system.Web>
    <authentication mode="Windows"/>
    <authorization>
        <allow roles=".\Administrators"/>
        <deny users="*"/>
    </authorization>
</system.Web>

然后,您必须在 IIS 中禁用对端点的匿名访问,而是启用 Windows 集成身份验证
在 IIS 管理控制台中,您可以通过为您的虚拟目录打开“属性”对话框来执行此操作。然后,您将在“目录安全”选项卡中找到安全设置。

当然,唯一可用的通信通道是 HTTP。客户端必须使用以下设置在传输级别的请求中提供其 Windows 身份:

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="WindowsSecurity">
                <security mode="Transport">
                    <transport clientCredentialType="Windows" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="https://localhost/myservice"
                  binding="wsHttpBinding"
                  bindingConfiguration="WindowsSecurity"
                  contract="IMyService" />
     </client>
</system.serviceModel>

请注意,如果您的服务端点使用wsHttpBinding,那么您还必须将 SSL 添加到您的端点,因为这是 WCF 在您使用传输级安全性时强制执行的要求。
如果改为使用basicHttpBinding,则可以使用 WCF 中一种安全性较低的身份验证模式,称为TransportCredentialOnly,不再需要 SSL。

有关更多详细信息,这里是 WCF 中安全基础结构的一个很好的概述。

于 2008-11-14T10:21:12.723 回答
4

Lars Wilhelmsen 发布了解决此问题的方法。看看 http://www.larswilhelmsen.com/2008/12/17/configurable-principalpermission-attribute/

于 2009-08-15T07:50:01.123 回答
3

如果我理解得很好,您想在运行时选择角色。这可以通过WCF 操作中的权限要求来完成。例如

public string method1()
{
    PrincipalPermission p = new PrincipalPermission(null, "Administrators");
    p.Demand();
    ...
于 2008-11-13T23:32:56.197 回答