3

最新のWIFSDK(.NET 4.0用)に付属しているパッシブケースとアクティブケースのプロジェクトテンプレートを使用して、動作するカスタムSTSを正常に作成しました。すべてが希望どおりに機能します。

現在、カスタムSTSを含め、Webアプリケーションとサービスを.NET4.5にアップグレードしようとしています。Microsoft.IdentityModel.xxxのすべての名前空間/クラスを、1つの例外(WSTrustServiceHostFactory)を除いて、フレームワークに組み込まれた新しい名前空間/クラスにマップすることができました。

そのクラスはもう存在しないようで、提供された機能を置き換える方法がわかりません。つまり、このリンクから:http: //msdn.microsoft.com/en-us/library/microsoft.identitymodel.protocols.wstrust.wstrustservicehostfactory

<%@ServiceHostLanguage="C#"Debug="true"Service="XXX.XXX.MyActiveSTSConfiguration"Factory="Microsoft.IdentityModel.Protocols.WSTrust.WSTrustServiceHostFactory"%>

私のパッシブSTSは、4.5にアップグレードした後、現在機能しています。4.5フレームワークを使用してアクティブなSecurityTokenServiceをインスタンス化する適切な/推奨される方法を見つける必要があります(理想的には、SDKプロジェクトテンプレートのようにほとんどの構成にweb.configを使用します)。任意の提案をいただければ幸いです。

4

1 に答える 1

8

いくつかのことを理解すると、これは非常に単純であることがわかりました。

サービス ホスト マークアップ:

<%@ ServiceHost Language="C#" Debug="true" Service="XXX.XXX.MyActiveSTSConfiguration" Factory="XXX.XXX.CustomWSTrustServiceHostFactory" %>

これが私のカスタム ファクトリ クラスの実装です。重要なのは、WSTrustServiceFactory を使用して WSTrustServiceHost を作成することはできなくなったため、CreateServiceHost メソッドのオーバーライドで自分で明示的に作成する必要があることです。

public class CustomWSTrustServiceHostFactory 
    : ServiceHostFactory {

    /// <summary>
    /// Initializes a new instance of the <see cref="CustomWSTrustServiceHostFactory"/> class.
    /// </summary>
    public CustomWSTrustServiceHostFactory() 
        : base() { }

    /// <summary>
    /// Creates and configures a <see cref="WSTrustServiceHost"/> with a specific base address.
    /// </summary>
    /// <param name="serviceType">Specifies the type of service to host (ignored).</param>
    /// <param name="baseAddresses">The <see cref="T:Uri"/> array that contains the base addresses for the service.</param>
    /// <returns>A <see cref="WSTrustServiceHost"/> with a specific base address.</returns>
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) {
        var config = new PortalActiveSTSConfiguration();
        var host = new WSTrustServiceHost(config, baseAddresses);
        //var host = base.CreateServiceHost(serviceType, baseAddresses);
        var serviceBehavior = host.Description.Behaviors.Find<ServiceBehaviorAttribute>();
        serviceBehavior.AddressFilterMode = AddressFilterMode.Any;
        return host;
    }

    /// <summary>
    /// Creates and configures a <see cref="WSTrustServiceHost"/> with a specific base address.
    /// </summary>
    /// <param name="constructorString">The constructor string (ignored).</param>
    /// <param name="baseAddresses">The <see cref="T:Uri"/> array that contains the base addresses for the service.</param>
    /// <returns></returns>
    public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses) {
        var config = new PortalActiveSTSConfiguration();
        var host = new WSTrustServiceHost(config, baseAddresses);
        //var host = base.CreateServiceHost(constructorString, baseAddresses);
        var serviceBehavior = host.Description.Behaviors.Find<ServiceBehaviorAttribute>();
        serviceBehavior.AddressFilterMode = AddressFilterMode.Any;
        return host;
    }

}

カスタム サービス構成クラスの実装 (基本的には WIF 4.0 STS テンプレートに付属するもの):

public class MyActiveSTSConfiguration 
    : SecurityTokenServiceConfiguration {

    public MyActiveSTSConfiguration()
        : base(
            WebConfigurationManager.AppSettings[ISSUER_NAME],
                new X509SigningCredentials(
                    CertificateUtil.GetCertificate(
                        StoreName.My, StoreLocation.LocalMachine, X509FindType.FindByThumbprint,
                        WebConfigurationManager.AppSettings[SIGNING_CERTIFICATE_THUMBPRINT], 
                        true)
                )
        ) {
        this.SecurityTokenService = typeof(MyActiveSTS);
    }

}
于 2012-09-05T15:22:26.487 に答える