我正在使用Windows Azure ACS构建单点登录应用程序。我使用javascript / HTML来收集用户的信息。我面临的问题是我需要在不同的主机上托管我的应用程序,例如:
我尝试为每个主机创建多个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.
如果这不是解决方案,如何让我的应用程序在多个主机上运行?
答案 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 ”元素中的“领域”属性。如果领域属性与您的应用程序运行的域不同,则身份验证将失败。
查看this和that个问题 - 两者都指向相同的文档并提供如何更改领域的示例,以防您想要在多个域下提供应用程序。我会查看更多样本。
在这里查看如何更改领域/返回地址/
答案 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();
}