【问题标题】:Hosting ACS Application on multiple hosts在多台主机上托管 ACS 应用程序
【发布时间】:2012-01-20 15:20:49
【问题描述】:

我正在使用 Windows Azure ACS 来构建单点登录应用程序。我正在使用 javascript/HTML 从用户那里收集信息。我面临的问题是我需要将我的应用程序托管在不同的主机上,例如:

  • 本地主机
  • 本地主机:81
  • *.cloudapp.net
  • 另一个内部主机,例如http://helloacs/

我尝试为每个主机创建多个依赖应用程序,但它仅适用于 localhost/localhost:81。我的 *.cloudapp.net 依赖方应用就是这样配置的:

Name: *.cloudapp.net
Realm: *.cloudapp.net
Return URL: http://*.cloudapp.net/

我的登录页面正在构建这样的回复网址:

http://*.cloudapp.net/Login.aspx

这是我生成的对 IdentityProviders.js 的调用:

https://*.accesscontrol.windows.net/v2/metadata/IdentityProviders.js?protocol=wsfederation&realm=*.cloudapp.net&reply_to=http://*.cloudapp.net/Login.aspx&version=1.0&callback=ShowSigninPage

导航到身份提供者并登录后,我得到:

ACS30000: There was an error processing an OpenID sign-in response. 

如果这不是解决方案,我怎样才能让我的应用程序在多个主机上运行?

【问题讨论】:

    标签: azure acs


    【解决方案1】:

    您为每个主机创建了多个依赖应用程序是正确的。但是,当您使用没有自定义代码的默认被动联合时,领域会在您的 web.config 文件中硬编码,如下所示:

      <microsoft.identityModel>
        <service>
         ..... 
         <audienceUris>
            <add value="http://localhost:4500/"/>
          </audienceUris>
          <federatedAuthentication>
            <wsFederation passiveRedirectEnabled="true" 
                          issuer="https://staykov.accesscontrol.windows.net/v2/wsfederation" 
                          realm="http://localhost:4500/"
                          requireHttps="false" />
            <cookieHandler requireSsl="false" />
          </federatedAuthentication>
    

    如果您希望同一个应用程序在多个主机名下同时运行,您必须添加一些编码。如果您只需要在不同域下测试相同的应用程序 - 只需将 web.config 中的域更改为相应的依赖方应用程序地址。您必须更改“audienceUris”部分中的地址和“wsFederation”元素中的“realm”属性。如果 realm 属性与您的应用程序运行的域不同,则身份验证将失败。

    查看this 和that 问题 - 两者都指向相同的文档和示例如何更改领域,以防您希望在多个域下为您的应用程序提供服务。我会寻找更多的样本。

    并在此处查看如何更改领域/返回地址/

    【讨论】:

      【解决方案2】:

      我遇到了类似的问题。我有两个 RP,一个使用 Windows Live Id 和 ADFS,第二个只使用 ADFS。两个 RP 都指向同一个云服务,所以当我转到 https://orgB.myDomanin.com 时,我被重定向到 ACS,但使用的是我在 web.config 中指定的领域,类似于:

      https://name.accesscontrol.windows.net/v2/wsfederation?wa=sigin1.0&wtrealm=https%3a%2f%orgA.myDomain.com%2.... 
      

      如果我像这样手动更改:

      https://name.accesscontrol.windows.net/v2/wsfederation?wa=sigin1.0&wtrealm=https%3a%2f%orgB.myDomain.com%2
      

      按应有的方式工作。

      最后,我在 Sandrino 的博客中找到了解决方案:http://fabriccontroller.net/blog/a-few-tips-to-get-up-and-running-with-theazure-appfabric-access-control-service,请参阅“更新您的领域”部分。如果博客无法访问,我将代码复制到这里,它必须在这个方法中:

      private void WSFederationAuthenticationModule_RedirectingToIdentityProvider(object sender, RedirectingToIdentityProviderEventArgs e)
      {
          // Get the request url.
          var request = HttpContext.Current.Request;
          var requestUrl = request.Url;
      
          // Build the realm url.
          var realmUrl = new StringBuilder();
          realmUrl.Append(requestUrl.Scheme);
          realmUrl.Append("://");
          realmUrl.Append(request.Headers["Host"] ?? requestUrl.Authority);
          realmUrl.Append(request.ApplicationPath);
          if (!request.ApplicationPath.EndsWith("/"))
              realmUrl.Append("/");
          e.SignInRequestMessage.Realm = realmUrl.ToString();
      }
      

      【讨论】:

        【解决方案3】:

        由于博客文章离线(并且有一段时间),我将在此处发布另一个答案。

        要为 ACS 依赖方配置多个 reply_to 地址,您需要使用 API。 (无法通过 Web 界面进行操作)。

        您可以在此处使用一些示例代码: http://msdn.microsoft.com/en-us/library/windowsazure/hh135147.aspx#BKMK_5

        你也可以使用FluentACS,这样会方便很多。

        【讨论】:

          猜你喜欢
          • 2016-04-14
          • 2017-08-06
          • 2016-12-13
          • 2020-10-22
          • 1970-01-01
          • 1970-01-01
          • 2014-03-26
          • 1970-01-01
          • 2023-01-07
          相关资源
          最近更新 更多