如何让两个网站对Thinktecture的Identity Server进行身份验证?

时间:2013-04-29 15:18:00

标签: single-sign-on wif thinktecture-ident-server

在身份和访问控制上查看PluralSite视频后,基本上设置了我需要的所有内容(我的机器上有一个正在运行的本地Thinktecture Identity Server实例,以及Identity and Access vs2012扩展),我无法在同一解决方案中获得两个Web应用程序来对Identity Server进行身份验证。

目前,他们都要求我登录id服务器,这不是我想要的,我希望能够登录到Id服务器一次,并对两个站点进行身份验证。

以下是web.config中我认为应该如何进行的部分:

“境界”到底是什么角色?这需要是一个真正的URL,还是可以像命名空间一样对待?当尝试使用Id Server在多个站点上发出的相同安全令牌时,我的映像领域必须发挥作用。

<system.identityModel.services>
<federationConfiguration>
<cookieHandler requireSsl="false" />
<wsFederation passiveRedirectEnabled="true" issuer="https://MyIdServer.com/idsvr/issue/wsfed" realm="http://MyLocalServerRunningIISExpress:55495/" reply="http://MyLocalServerRunningIISExpress:55495/" requireHttps="false" />
</federationConfiguration>
</system.identityModel.services>

audienceUris如何运作?我假设如果我想在多个站点中使用一个安全令牌,我需要在audienceUris部分中显示每个站点的URL?

<system.identityModel>
<identityConfiguration>
<claimsAuthenticationManager type="SSO.Security.ClaimsAuthenticationManager, SSO.Security" />      
<audienceUris>
<add value="http://MyLocalServerRunningIISExpress:55495/" />
<add value="http://MyLocalServerRunningIISExpress:53133/" />
</audienceUris>
</identityConfiguration>
</system.identityModel>

第二个站点的另一个web.config文件就像上面的部分一样,但是在URL上更改了端口号。

再一次,我确实让Id Srv将一个令牌传回给我,为一个网站验证我的身份,但我不能为我的生活让它为两个人工作。

我猜这是一个配置问题,或者我可能在两个端口号上运行两个IIS Express实例,而不是让一个真正的IIS服务器调用并使用URL代替?

任何帮助或指示都将不胜感激。

谢谢, 麦克

4 个答案:

答案 0 :(得分:1)

您是否尝试过FederatedSignOut?

WSFederationAuthenticationModule am = FederatedAuthentication.WSFederationAuthenticationModule;
WSFederationAuthenticationModule.FederatedSignOut(new Uri(am.Issuer), new Uri(am.Realm));

我知道这是WIF 1.0,但在WIF 4.5中应该有类似内容

答案 1 :(得分:1)

nzpcmad,这是4.5中的相似之处:

var authModule = FederatedAuthentication.WSFederationAuthenticationModule;
authModule.SignOut(false);
var signOutRequestMessage = new SignOutRequestMessage(new Uri(authModule.Issuer), authModule.Realm);
var queryString = signOutRequestMessage.WriteQueryString();
return new RedirectResult(queryString);

我认为这里的问题与Thinktecture Id Svr发布cookie的方式有关,该cookie应该跟踪哪些依赖方被认证。出于某种原因,在收到注销请求之前,似乎没有发布包含经过身份验证的RP的cookie,并且我认为在收到登录请求时应该发出cookie?

其他一些人遇到了同样的问题,GitHub上有一张票据: https://github.com/thinktecture/Thinktecture.IdentityServer.v2/issues/197

答案 2 :(得分:0)

好吧,显然,你必须检查“记住我”复选框,以便cookie传播到其他网站。所以,从本质上讲,这现在有效。但我仍然无法正确注销。再次,正在注销的网站正在清除它自己的cookie,然后处理STS cookie,但另一个网站仍然登录。

在STS服务器注销页面上,源视图具有:

<iframe style="visibility: hidden; width: 1px; height: 1px" src="http://MyServer:55495/?wa=wsignoutcleanup1.0"></iframe>

但由于目前有两个网站登录,我应该在这里看到其中两个条目,因此该页面也可以清理该cookie。

这是我的退出代码:

var authModule = FederatedAuthentication.WSFederationAuthenticationModule;

//clear local cookie
authModule.SignOut(false);

//initiate federated sign out request to the STS
var signOutRequestMessage = new SignOutRequestMessage(new Uri(authModule.Issuer), authModule.Realm);
var queryString = signOutRequestMessage.WriteQueryString();
return new RedirectResult(queryString);

我相信这段代码是正确的,但我想问题是STS服务器没有跟踪哪些依赖方已登录并需要销毁其cookie?

答案 3 :(得分:0)

在Cookie处理程序中,您应指定namedomain(可能还有path)。这些在使用它的所有站点上必须相同。

<system.identityModel.services>
  <federationConfiguration>
    <cookieHandler requireSsl="false" 
       name="myCookieName" domain="MyLocalServerRunningIISExpress" path="/"/>
    <wsFederation passiveRedirectEnabled="true" requireHttps="false" 
       issuer="https://MyIdServer.com/idsvr/issue/wsfed" 
       realm="http://MyLocalServerRunningIISExpress:55495/" />
  </federationConfiguration>
</system.identityModel.services>

我不确定如何使用不同的端口号进行设置。我的设置是标准的IIS,并且两个站点作为应用程序在同一个根目录上运行。

我知道的另一个设置是将两个站点设置为共同的域的最后一部分。这就是网站有网址:site1.mydomain.comsite2.mydomain.com。然后,domain中的<cookieHandler>参数设置为mydomain.com

是的,所有网站都必须像您在示例中一样列在<audienceUris>中。

注意:
如果reply网址与realm相同,则不严格需要reply参数。