RESTful WCF 服务安全性

Posted

技术标签:

【中文标题】RESTful WCF 服务安全性【英文标题】:RESTful WCF service security 【发布时间】:2012-02-13 20:38:47 【问题描述】:

我们如何验证/授权 WCF RESTful 服务(使用 webHttpBinding(而不是 wsHttpBinding,如 SOAP 案例))? IE。我们想使用 Membership/Roles 来允许(或禁止)用户根据其角色使用每个 Web 方法。

提前致谢。 宜兰。

【问题讨论】:

@simchona SOAP - 简单对象访问协议 您能否发布一些配置文件以了解您的 REST 服务是如何实现的?是通过 Restful API 还是使用 webHttpBinding 定义的端点? 【参考方案1】:

您可以使用证书来保护服务或在标头中发送用户名和密码。然后,您可以通过在服务中实现IAuthorizationPolicy 来添加行为,这样您就不必在您公开的每个 Web 服务方法中实现安全检查。

public class CertificateAuthorizationPolicy : IAuthorizationPolicy


    public bool Evaluate(EvaluationContext evaluationContext, ref object state)
    
        IIdentity identity;
        object untypedIdentities;
        if (!evaluationContext.Properties.TryGetValue("Identities", out untypedIdentities))
        
            identity = null;
            return false;                                                                                                             
        

        var identities = (IEnumerable<IIdentity>)untypedIdentities;

        identity = identities.Where(item => item.AuthenticationType == "X509").FirstOrDefault();

        var claimSet = (X509CertificateClaimSet)evaluationContext.ClaimSets[0];
        var certificate = claimSet.X509Certificate;

    

在 web.config 中告诉服务使用授权策略

    <behavior name="CertificateSecurityServiceBehavior">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceAuthorization principalPermissionMode="Custom">
        <authorizationPolicies>
          <add policyType="CertificateAuthorizationPolicy, MyAssembly.Security" />
        </authorizationPolicies>
      </serviceAuthorization>
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    </behavior>

另一种选择是在 IIS 服务器上设置 SSL,以便它需要 SSL 和客户端证书才能连接到任何页面。

【讨论】:

非常有趣.. 我们已经购买并安装了 VeriSign 证书 - 使用 https 而不是 http。对于 IOperationBehavior,我可以将它与 webHttpBinding 一起使用吗?你能指点我一些代码sn-p吗?谢谢。 我添加了一个带有实现示例的链接 很棒的文章,谢谢。但是我们仍然不知道如何使用您提出的 IOperationBehavior 来允许/禁止使用 Microsoft 成员资格/角色提供程序访问 Web 方法。 我已经更新了实现。我的记忆有点失败,安全检查是通过使用 IAuthorizationPolicy 接口设置的

以上是关于RESTful WCF 服务安全性的主要内容,如果未能解决你的问题,请参考以下文章

使用 transportCredentialOnly 安全性对 RESTful WCF 服务的跨域 Ajax JSON POST 支持

如何对 WCF 4 RESTful 服务进行身份验证?

用于支持 HTTP 和 HTTPS 的 WebHttpBinding(Restful) 的 WCF 配置

使用 RESTful WCF 和 Windows 窗体的用户/通过身份验证

面向公众的服务器安全性上的内部 WCF 服务

对于 WCF 服务,没有证书的 TransportWithMessageCredential 是不是足够安全?