У нас есть сценарий в нашем проекте,Настройка и области эмитента для веба-службы во время выполнения (Windows Azure ACS)
Мы Арендатор-1 для квартиросъемщиков-п, которые потребляют RESTful Service S1. Жильцы имеют отношение 1 к 1 с ВПЛ. Клиент должен объединить пользовательский интерфейс арендатора через Restful Service с помощью ACS с помощью конкретного IDP-агента, настроенного в ACS во время onboarding.
Арендатором-1 отображается в IdP1 (например, Yahoo) Арендатором-2 отображается в Idp2 (например, Google)
Restful Service возвращает JavaScript в формате JSON, который размещается в веб-интерфейсе Арендатора. Поэтому, если арендатор уже зарегистрировался в пользовательском интерфейсе Арендатора, используя IDP, специфичный для него через его собственное приложение, то для любых запросов от пользовательского интерфейса арендатора к Restful Service служба Restful должна объединяться с конкретным IdP для арендатора на основе информации о партнере (сопоставление арендатора в IdP), сконфигурированный во время процесса onboarding.
Я устанавливаю Realm в Global.asax, как показано ниже.
public class WebApiApplication : System.Web.HttpApplication
{
public event EventHandler RedirectingToIdentityProvider;
public override void Init()
{
FederatedAuthentication.WSFederationAuthenticationModule.RedirectingToIdentityProvider += WSFederationAuthenticationModule_RedirectingToIdentityProvider;
}
void WSFederationAuthenticationModule_RedirectingToIdentityProvider(object sender, RedirectingToIdentityProviderEventArgs e)
{
Tenant tenant = GetTenantDetails(subId); // Gets the tenant information from MetaData based on subscriptionId
if (tenant != null)
{
e.SignInRequestMessage.Realm = tenant.Realm + "CMS/";
}
}
protected void Application_Start()
{
FederatedAuthentication.FederationConfigurationCreated += OnServiceConfigurationCreated;
}
private void OnServiceConfigurationCreated(object sender, FederationConfigurationCreatedEventArgs e)
{
if (tenant != null)
{
e.FederationConfiguration.WsFederationConfiguration.Issuer = tenant.Issuer;
Uri uri = new Uri(tenant.Realm + "CMS/");
if (!e.FederationConfiguration.IdentityConfiguration.AudienceRestriction.AllowedAudienceUris.Contains(uri))
e.FederationConfiguration.IdentityConfiguration.AudienceRestriction.AllowedAudienceUris.Add(new Uri(tenant.Realm + "CMS/"));
e.FederationConfiguration.WsFederationConfiguration.Realm = tenant.Realm + "CMS/";
}
}
Дальше Царство также установлено на уровне запроса, как показано ниже.
public class MetaDataModule : IHttpModule
{
private static string WSFederationAuthenticationModuleName = string.Empty;
public void Init(HttpApplication httpContextApplication)
{
var requestWrapper = new EventHandler(DoSyncRequestWorkToGetTenantDetails);
httpContextApplication.BeginRequest += requestWrapper;
}
private static void DoSyncRequestWorkToGetTenantDetails(object sender, EventArgs e)
{
var httpContextApplication = (HttpApplication)sender;
Tenant tenant = GetTenantDetails(); // Gets the tenant information from MetaData based on subscriptionId
if (tenant != null)
{
WSFederationAuthenticationModule wsfed = (WSFederationAuthenticationModule)httpContextApplication.Modules["WSFederationAuthenticationModule"];
wsfed.FederationConfiguration.WsFederationConfiguration.Issuer = tenant.Issuer;
Uri uri = new Uri(tenant.Realm + "CMS/");
if (!wsfed.FederationConfiguration.IdentityConfiguration.AudienceRestriction.AllowedAudienceUris.Contains(uri))
wsfed.FederationConfiguration.IdentityConfiguration.AudienceRestriction.AllowedAudienceUris.Add(new Uri(tenant.Realm + "CMS/"));
wsfed.FederationConfiguration.WsFederationConfiguration.Realm = tenant.Realm + "CMS/";
//FederatedAuthentication.FederationConfiguration.WsFederationConfiguration.Issuer = tenant.Issuer;
//Uri uri = new Uri(tenant.Realm + "CMS/");
//if (!FederatedAuthentication.FederationConfiguration.IdentityConfiguration.AudienceRestriction.AllowedAudienceUris.Contains(uri))
// FederatedAuthentication.FederationConfiguration.IdentityConfiguration.AudienceRestriction.AllowedAudienceUris.Add(new Uri(tenant.Realm + "CMS/"));
//FederatedAuthentication.FederationConfiguration.WsFederationConfiguration.Realm = tenant.Realm + "CMS/";
}
}
Вы можете найти модули, зарегистрированные в Web.config и оставшуюся часть конфигурации WIF тоже.
Несмотря на сброс Королевства для каждого запроса, новое значение не будет присвоено.
Клиент не хочет, чтобы их арендаторы реализовали любой код, связанный с аутентификацией или федерацией, с их конца, чтобы это работало.
Пожалуйста, дайте мне знать, если вы можете придумать какое-либо решение этой проблемы с помощью Passive Federation.