2013-03-13 1 views
3

Simple Single Sign-On вопросSingle Sign On с ОКС через несколько приложений

У меня есть два MVC4 приложения:

**1**- http://localhost/BikeShop  

    ACS Relying Party: 

- Name: **BikeShop** 
- Return Url: **http://localhost/BikeShop** 
- Token Format: **SAML 2.0** 


**2**- http://localhost/BikePartsShop 

    ACS Relying Party: 

- Name: **BikePartsShop** 
- Return Url: **http://localhost/BikePartsShop** 
- Token Format: **SAML 2.0** 

Сценарий, у меня есть

I доступ Здесь представлен BikeShop и страница входа в ACS, и я выбираю свою идентификационную информацию.

Теперь я могу делать вещи на BikeShop.

Затем я получаю доступ к BikePartsShop и представлена ​​страница входа в ACS, и я могу выбрать свою идентификационную информацию.


Сценарий, я должен иметь

получить доступ BikeShop и ACS Войти Страница представлена ​​и я выбираю свою идентичность.

Теперь я могу делать вещи на BikeShop.

Тогда я достигаю BikePartsShop и ACS разрешает ту же идентичность используется в BikeShop без дальнейшего вмешательства пользователя.


Кто-нибудь выполнил этот сценарий?

С наилучшими пожеланиями, и спасибо!

+0

Должен ли BikeShop и BikePartsShop быть одним RP, а не двумя? Один RP может поддерживать несколько адресов ответа, и это позволит использовать тот же токен для обоих. –

+0

Как это можно сделать с помощью ACS. Сторонники ретрансляции ACS могут иметь только один адрес ответа на адрес (URL-адрес возврата) – TheBigCheese

+0

Это не так, ACS поддерживает настройку как можно большего количества адресов адресов. Я отправлю ответ. –

ответ

1

Вы можете использовать службу управления ACS для настройки нескольких адресов ответов для одной и той же доверяющей стороны. См. this link для получения подробной информации о том, как добавить RP. Из связанного образца кода, зарегистрировать несколько адресов следующим образом:

RelyingParty relyingParty = new RelyingParty() 
{ 
    Name = "BikeShop", 
    AsymmetricTokenEncryptionRequired = false, 
    TokenType = "SAML_2_0", 
    TokenLifetime = 3600 
}; 

svc.AddToRelyingParties(relyingParty); 

RelyingPartyAddress realm = new RelyingPartyAddress() 
{ 
    Address = "http://localhost/", 
    EndpointType = "Realm" 
}; 

RelyingPartyAddress replyAddress1 = new RelyingPartyAddress() 
{ 
    Address = "http://localhost/BikeShop", 
    EndpointType = "Reply" 
}; 

RelyingPartyAddress replyAddress2 = new RelyingPartyAddress() 
{ 
    Address = "http://localhost/BikePartsShop", 
    EndpointType = "Reply" 
}; 

svc.AddRelatedObject(relyingParty, "RelyingPartyAddresses", realmAddress); 
svc.AddRelatedObject(relyingParty, "RelyingPartyAddresses", replyAddress1); 
svc.AddRelatedObject(relyingParty, "RelyingPartyAddresses", replyAddress2); 

svc.SaveChanges(SaveChangesOptions.Batch); 
+0

Я попробую это решение. Спасибо! – TheBigCheese

+0

Это решение не работает для моего сценария. – TheBigCheese

+0

После реализации всего кода и успешного его развертывания и запуска, была создана Партия поддержки ACS, добавлены поставщики удостоверений и настроены адреса ответов. Все правила выполняются правильно для обоих приложений. Требования правильно построены.Но я все еще не могу изменить между сайтами, не показывая экран «Вход в систему» ​​из ACS, где вы выбираете поставщик удостоверений, который хотите использовать. – TheBigCheese

0

Попробуйте этот код, чтобы помочь вам вперед к конкретному провайдеру идентификации, если вы можете понять, как вспомнить, какую идентичность поставщика они в последний раз использовали. Последний логин должен быть сохранен, чтобы вы автоматически вернули свое приложение.

public IdentityProvider GetIdentityProvider(string identityProviderName, string realm , string audienceUri) 
     { 
      // acs config parameters 
      string acsNamespace = ConfigurationManager.AppSettings["ida:Namespace"]; 
      realm = realm ?? Uri.EscapeDataString(ConfigurationManager.AppSettings["ida:Realm"]); 
      audienceUri = audienceUri ?? ConfigurationManager.AppSettings["ida:AudienceUri"]; 

      string returnPath = Uri.EscapeDataString("/home/index"); 
      var newReplyTo = 
       Uri.EscapeDataString(audienceUri.Replace(new Uri(audienceUri).Authority, 
        HttpContext.Current.Request.Url.Authority)); 
      // retrieve current identity providers 
      string idpDiscoveryUrl = string.Format("{0}v2/metadata/IdentityProviders.js?protocol=wsfederation&realm={1}&reply_to={2}&context=rm%3d0%26id%3dpassive%26ru%3d{3}&request_id=&version=1.0", acsNamespace, realm, newReplyTo, returnPath); 
      string response = null; 
      using (var client = new WebClient()) { 
      response = client.DownloadString(idpDiscoveryUrl);  
      } 

      List<IdentityProvider> identityProviders = JsonConvert.DeserializeObject<List<IdentityProvider>>(response); 
      // lookup provider for tenant 
      var identityProvider = identityProviders.Where(i => i.Name == identityProviderName).FirstOrDefault() ?? new IdentityProvider(); 

      return identityProvider; 
     }