3

シンプルなシングル サインオンの質問

2 つの 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**

私が持っているシナリオ

BikeShopにアクセスすると、ACS ログイン ページが表示され、ID を選択します。

私は今、BikeShopで何かをすることができます。

次に、 BikePartsShopにアクセスすると、ACS ログイン ページが表示され、ID を選択できます。


私が持つべきシナリオ

BikeShopにアクセスすると、ACS ログイン ページが表示され、ID を選択します。

私は今、BikeShopで何かをすることができます。

次に、 BikePartsShopにアクセスすると、ユーザーの介入なしで、 BikeShopで使用されているのと同じ ID が ACS によって承認されます。


誰かがこのシナリオを実装しましたか?

よろしくお願いします。

4

2 に答える 2

1

ACS 管理サービスを使用して、同じ証明書利用者に対して複数の応答アドレスを構成できます。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);
于 2013-03-15T18:36:03.427 に答える
0

最後に使用した ID プロバイダーを思い出す方法がわかれば、特定の ID プロバイダーに転送するためにこのコードを試してみてください。アプリに自動的に 302 で戻るように、最後のログインを保存する必要があります。

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;
        }
于 2014-04-04T14:16:56.910 に答える