8

状況

一部の WCF サービスにさまざまな種類のセキュリティを実装しています。ClientCertificate、ユーザー名とパスワード、および匿名。

httpBinding 用と wsHttpBinding 用の 2 つの ServiceBehaviorConfigurations があります。(クレームベースのセキュリティ用のカスタム承認ポリシーがあります) 要件として、サービスごとに異なるエンドポイントが必要です。httpBinding を持つ 3 つのエンドポイントと wsHttpBinding を持つ 1 つのエンドポイント。

1 つのサービスの例:

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

注: .NET 3.5 に取り組んでいます

問題

パート 1: http サービス構成で 1 回、wsHttp サービス構成で 1 回、同じサービスを 2 回指定することはできません。

パート 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 に別の方法で承認ポリシーを適用するにはどうすればよいでしょうか。エンドポイントの動作を使用しますが、エンドポイントの動作で承認ポリシーを指定することはできません

4

1 に答える 1

2

承認は、サービス レベルの責任です。エンドポイントごとに変更することはできません。

大まかに言えば、次のことを行う必要があります。

  1. 必要なさまざまなセキュリティ構成を使用するようにエンドポイント バインディングを定義します (実際に実行しました)。
  2. カスタムClaimsAuthenticationManagerを作成して、さまざまなバインディングが提示するさまざまな ID に基づいてクレームを割り当てます。

概念的には、ClaimsAuthenticationManager は、さまざまな資格情報に基づいてクレームを追加する "サービス中の STS" として機能します。そこから、サービスでクレーム ベースの承認を行います。

あなたが望む構成可能な認証マネージャーを私は知らないので、独自に作成する必要があります (私が間違っていることが判明した場合は、見つけたものを投稿してください)。

ClaimsAuthenticationManager を実装するには、Windows Identity Frameworkが必要です。以下は、私が使用した .NET 4.0 実装の概要です (これは 4.5 の方が簡単かもしれません)。コードがコンパイルされておらず、完全ではないことをお詫びしますが、公開投稿のためにすべてをスクラブする時間はありません。ただし、これは正しい方向を示しているはずです。

Microsoft.IdentityModel.Claims.ClaimsAuthenticationManagerから継承し、Authenticate() を実装します。次のようになります。

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>
于 2012-09-06T18:50:13.743 に答える