2

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

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

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

“境界”的作用究竟是什么?这需要是一个真实的 URL,还是可以像命名空间一样对待?当尝试在多个站点上使用由 Id 服务器颁发的相同安全令牌时,我的映像领域必须发挥作用。

<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 将一个令牌传回给我,该令牌对我进行 ONE 站点的身份验证,但我终其一生都无法让它为两个站点工作。

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

4

4 回答 4

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

于 2013-04-30T16:24:32.783 回答
1

您是否尝试过 FederatedSignOut?

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

我知道这是 WIF 1.0 但在 WIF 4.5 中应该有类似的东西

于 2013-04-29T20:03:24.030 回答
0

在 cookie 处理程序中,您应该指定name, domain(并且可能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,两个站点作为应用程序在同一个根目录下运行。

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

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

注意:
replyurl 与 相同时realm,该reply参数不是必须的。

于 2013-06-21T07:29:24.603 回答
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?

于 2013-04-29T19:18:58.357 回答