在带有 WCF 的 App.config 中使用 Windows 角色身份验证

Posted

技术标签:

【中文标题】在带有 WCF 的 App.config 中使用 Windows 角色身份验证【英文标题】:Using Windows Role authentication in the App.config with WCF 【发布时间】:2010-09-22 05:32:45 【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

【参考方案1】:

如果您在 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 不支持需要更长的时间。

如需更多详细信息,here 很好地概述了 WCF 中的安全基础结构。

【讨论】:

请注意,如果您想这样做,您需要在您的 web.config 文件中启用 ASP.NET 兼容模式。否则它就不会工作(也不会抛出错误)。 注意:要使此功能起作用,system.web/roleManager/@enabled 必须为 false 或省略,否则角色将是 IIS .Net 角色,而不是 Windows 组。【参考方案2】:

Lars Wilhelmsen 已针对此问题发布了解决方案。看一下 http://www.larswilhelmsen.com/2008/12/17/configurable-principalpermission-attribute/

【讨论】:

当前网址是larsw.wordpress.com/2008/12/17/…。【参考方案3】:

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

public string method1()

    PrincipalPermission p = new PrincipalPermission(null, "Administrators");
    p.Demand();
    ...

【讨论】:

以上是关于在带有 WCF 的 App.config 中使用 Windows 角色身份验证的主要内容,如果未能解决你的问题,请参考以下文章

WCF 何时使用 app.config 或 web.config?

使用 App.Config 在 Windows 服务中的 WCF 命名管道

WCF - 在单个 APP.Config 文件中定义多个服务?

.Net Core 中的 Http 绑定使用带有 wcf 引用的库项目

从类库调用 WCF 服务:App.Config 与 Web.Config?

WCF 配置 - 将其从 app.config 中拆分出来