-->

每个端点不同的服务行为(Different Service behaviors per endpoi

2019-07-31 10:04发布

这种情况

我们正在对一些WCF服务实现不同类型的安全性。 ClientCertificate,用户名和密码和匿名。

我们有2个ServiceBehaviorConfigurations,一个用于httpBinding,一个用于的wsHttpBinding。 ( 我们有基于要求定制的安全授权策略 )作为一项要求,我们需要为每个服务不同的端点。 3个端点与httpBinding和1的wsHttpBinding。

例如,对于一个服务:

  • basicHttpBinding的:匿名
  • basicHttpBinding的:UserNameAndPassword
  • basicHttpBinding的:BasicSsl
  • 的wsHttpBinding:BasicSsl

注意:我们在.NET 3.5工作

问题

第1部分:我们不能与wsHttp服务配置指定相同的服务两次,一次与HTTP服务配置和一次。

第2部分:我们不能在端点上指定的服务行为。 (抛出和异常,没有终点的行为被发现...服务行为不能被设置为端点的行为)

该配置

对于第1部分:

<services>
  <service name="Namespace.MyService" behaviorConfiguration="securityBehavior">
   <endpoint address="http://server:94/MyService.svc/Anonymous" contract="Namespace.IMyService" binding="basicHttpBinding" bindingConfiguration="Anonymous">
    </endpoint> 
    <endpoint address="http://server:94/MyService.svc/UserNameAndPassword" contract="Namespace.IMyService" binding="basicHttpBinding" bindingConfiguration="UserNameAndPassword">
    </endpoint>
    <endpoint address="https://server/MyService.svc/BasicSsl" contract="Namespace.IMyService" binding="basicHttpBinding" bindingConfiguration="BasicSecured">
    </endpoint>
  </service>
  <service name="Namespace.MyService" behaviorConfiguration="wsHttpCertificateBehavior">
    <endpoint address="https://server/MyService.svc/ClientCert" contract="Namespace.IMyService" binding="wsHttpBinding" bindingConfiguration="ClientCert"/>
  </service>
</services>

服务行为的配置:

<serviceBehaviors>
<behavior name="securityBehavior">
  <serviceAuthorization serviceAuthorizationManagerType="Namespace.AdamAuthorizationManager,Assembly">
    <authorizationPolicies>
      <add policyType="Namespace.AdamAuthorizationManager,Assembly" />
    </authorizationPolicies>
  </serviceAuthorization>
</behavior>
<behavior name="wsHttpCertificateBehavior">
  <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"/>
  <serviceAuthorization serviceAuthorizationManagerType="Namespace.AdamAuthorizationManager,Assembly">
    <authorizationPolicies>
      <add policyType="Namespace.AdamAuthorizationManager,Assembly" />
    </authorizationPolicies>
  </serviceAuthorization>
  <serviceCredentials>
    <clientCertificate>
      <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck"/>
    </clientCertificate>
    <serviceCertificate findValue="CN=CertSubject"/>
  </serviceCredentials>
</behavior>

我们怎么可以指定在WsHttpBinding的端点不同的服务行为? 或者,我们如何能够运用我们的授权策略,以不同的方式进行,然后WsHttpBinding的basicHttpBinding的。 我们将使用端点的行为,但我们不能确定在端点的行为我们的授权策略

Answer 1:

授权是一种服务水平的责任。 您无法通过端点因人而异吧。

在高层次上,你应该:

  1. 定义端点绑定使用,你需要不同的安全配置(你没有)
  2. 创建自定义ClaimsAuthenticationManager分配基础上,不同的身份,不同的绑定将提出索赔。

概念上ClaimsAuthenticationManager充当添加基于所述变化的凭证的权利要求的“在服务STS”。 从那里,你做你的服务基于声明的授权。

我不知道任何配置的授权管理,将千方百计想让你想要的,所以你必须编写自己的(如果你证明我错了,请发表你发现了什么)。

实施ClaimsAuthenticationManager要求Windows身份验证框架 。 下面是我用(这可能在4.5更容易)一个.NET 4.0实现的总结。 我很抱歉,代码不编译并且是不完整的,但我没有时间来擦洗家居的公开信息。 这应该指向你在正确的方向,但。

继承Microsoft.IdentityModel.Claims.ClaimsAuthenticationManager并实现身份验证()。 它应该是这个样子:

namespace MyWCF.ClaimsInjection
{
    public class ClaimsAuthenticationManager : Microsoft.IdentityModel.Claims.ClaimsAuthenticationManager
    {
        public override IClaimsPrincipal Authenticate(string resourceName, IClaimsPrincipal incomingPrincipal)
        {
            if (incomingPrincipal == null)
            {
                throw new ArgumentNullException("incomingPrincipal", "ClaimInjectionClaimsAuthenticationManager requires a principal.");
            }

            IClaimsPrincipal resultPrincipal = base.Authenticate(resourceName, incomingPrincipal);
            foreach (IIdentity identity in resultPrincipal.Identities)
            {
                if (identity is ClaimsIdentity)
                {
                    // Add claims based on client cert here…
                    Claim identityClaim = ((ClaimsIdentity)identity).Claims.First(c => c.ClaimType == ClaimTypes.Thumbprint);
                    ((ClaimsIdentity)identity).Claims.Add(new Claim("MyType", "Myvalue"));
                }
                else if (identity is WindowsClaimsIdentity)
                {
                    // Add claims based on window group or account here…
                }

                // continue checking different identity types...
            }
            return resultPrincipal;
        }
    }
}

现在只要安装自定义管理器(仅包括有趣的部分):

<configuration>
  <configSections>
    <section name="microsoft.identityModel" type="Microsoft.IdentityModel.Configuration.MicrosoftIdentityModelSection, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="serviceBehavior">
          <federatedServiceHostConfiguration />
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <extensions>
      <behaviorExtensions>
        <add name="federatedServiceHostConfiguration" type="Microsoft.IdentityModel.Configuration.ConfigureServiceHostBehaviorExtensionElement, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </behaviorExtensions>
    </extensions>
  </system.serviceModel>

  <microsoft.identityModel>
    <service>
      <claimsAuthenticationManager type="MyWCF.ClaimsAuthenticationManager, MyWCF"/>
    </service>
  </microsoft.identityModel>
</configuration>


文章来源: Different Service behaviors per endpoint