2013-11-28 2 views
0

У нас есть сценарий в нашем проекте,Настройка и области эмитента для веба-службы во время выполнения (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.

ответ

0

Вы должны настроить область в методе Application_AuthenticateRequest в своем Global.asax. Взгляните на это link.

Смежные вопросы