1

我正在使用 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. 

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

4

3 回答 3

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 ”元素中的“ realm ”属性。如果领域属性与您的应用程序运行的域不同,则身份验证将失败。

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

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

于 2012-01-20T15:49:44.080 回答
1

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

要为 ACS 信赖方配置多个reply_to地址,您需要使用 API。(无法从 Web 界面执行此操作)。

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

您还可以使用FluentACS,这将使其变得容易得多。

于 2012-12-03T10:20:13.310 回答
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();
}
于 2013-03-06T10:58:01.950 回答