在查看了关于身份和访问控制的PluralSite视频后,基本上得到了我需要的一切(我在我的机器上有一个正在运行的Thinktecture身份服务器的本地实例,以及Identity和Access vs2012扩展),我无法在同一解决方案中获得两个web应用程序来对身份服务器进行身份验证。
目前,他们都要求我登录到id服务器,这不是我想要的,我希望能够登录到id服务器一次,并为两个站点进行认证。
这是网络的部分。我认为这决定了它应该如何运行:
"real "的作用到底是什么?这是否需要是一个真正的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。第二个站点的配置文件就像上面的部分一样,但是在URL上更改了端口号。
再次,我确实有Id Srv传递回令牌给我,对我进行一个站点的身份验证,但我不能为我的生命让它为两个工作。
我猜这是一个配置问题,或者可能是我在两个端口号上运行两个IIS快速实例,而不是让一个真正的IIS服务器参与并使用URL代替的事实?
您尝试过FederatedSignOut吗?
WSFederationAuthenticationModule am = FederatedAuthentication.WSFederationAuthenticationModule;
WSFederationAuthenticationModule.FederatedSignOut(new Uri(am.Issuer), new Uri(am.Realm));
我知道这是WIF 1.0,但在WIF 4.5中应该有类似的东西
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
好的,显然,你必须选中"记住我"复选框,以便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 ?
在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.com
和site2.mydomain.com
。则将<cookieHandler>
中的domain
参数设置为mydomain.com
。
是的,所有的网站都必须在<audienceUris>
中列出,就像你已经在你的例子中一样。
注意:
当reply
和realm
url相同时,不需要严格设置reply
参数