在多个主机上托管ACS应用程序

时间:2012-01-20 15:20:50

标签: azure acs

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

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

我尝试为每个主机创建多个Relying Applications,但它仅适用于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. 

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

3 个答案:

答案 0 :(得分:3)

为每个主机创建多个依赖应用程序是正确的。但是,当您使用没有自定义代码的默认被动联合时,域将在您的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 ”元素中的“领域”属性。如果领域属性与您的应用程序运行的域不同,则身份验证将失败。

查看thisthat个问题 - 两者都指向相同的文档并提供如何更改领域的示例,以防您想要在多个域下提供应用程序。我会查看更多样本。

在这里查看如何更改领域/返回地址/

答案 1 :(得分:1)

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

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

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

您还可以使用FluentACS,这将使其变得更加轻松。

答案 2 :(得分:1)

我遇到了类似的问题。我有两个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();
}