Попытка конвертировать WIS 4.0 пользовательскую STS (из шаблона проекта) для использования .NET 4.5

Я успешно создал рабочую пользовательскую STS, используя шаблоны проектов для пассивных и активных случаев, которые поставляются с последним WIF SDK (для .NET 4.0). Все работает по своему желанию.

Теперь я пытаюсь обновить свои веб-приложения и службы до .NET 4.5, включая мой пользовательский STS. Мне удалось сопоставить все пространства имен/классы из Microsoft.IdentityModel.xxx с новыми пространствами имен/классами, встроенными в фреймворк, с одним исключением - 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. Мне нужно найти подходящий/рекомендуемый метод создания активной службы SecurityTokenService с использованием рамки 4.5 (в идеале, с использованием web.config для большей конфигурации, как в шаблонах проектов SDK). Любые предложения приветствуются.

1 ответ

Это оказалось довольно простым, как только я понял несколько вещей.

Разметка служебного хоста:

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

Вот моя обычная реализация класса factory. Ключ в том, что, поскольку вы больше не можете использовать WSTrustServiceFactory для создания WSTrustServiceHost для вас, вы должны явно создать его самостоятельно в переопределении метода CreateServiceHost.

public class CustomWSTrustServiceHostFactory 
 : ServiceHostFactory {
 /// <summary>
 /// Initializes a new instance of the <see cref="CustomWSTrustServiceHostFactory"> class.
 /// </see></summary>
 public CustomWSTrustServiceHostFactory() 
 : base() { }
 /// <summary>
 /// Creates and configures a <see cref="WSTrustServiceHost"> with a specific base address.
 /// </see></summary>
 /// Specifies the type of service to host (ignored).
 /// The <see cref="T:Uri"> array that contains the base addresses for the service.
 /// <returns>A <see cref="WSTrustServiceHost"> with a specific base address.</see></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.
 /// </see></summary>
 /// The constructor string (ignored).
 /// The <see cref="T:Uri"> array that contains the base addresses for the service.
 /// 
 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;
 }
}
</servicebehaviorattribute></see></servicebehaviorattribute></see>

Реализация класса конфигурации пользовательских сервисов (в основном, что входит в шаблон 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);
 }
}

licensed under cc by-sa 3.0 with attribution.