关键细节:
> C#4.5
> IIS 7.5(Win 2008 R2)
> Sitecore 6.6 rev 130529
我试图将Sitecore链接到Visual Studio Identity and Access Tool提供的VS2012 LocalSTS实例,之后是Kevin Buckley(link)的博客文章,该文章是在WIF集成到C#4.5之前编写的.我正在尝试执行被动RP行为.
我已根据需要将Microsoft.IdentityModel名称空间更新为System.IdentityModel和System.IdentityModel.Services名称空间.
我的< system.IdentityModel>部分如下:
<system.identityModel> <identityConfiguration> <audienceUris> <add value="http://localhost/" /> </audienceUris> <certificateValidation certificateValidationMode="None" /> <issuerNameRegistry type="System.IdentityModel.Tokens.ValidatingIssuerNameRegistry, System.IdentityModel.Tokens.ValidatingIssuerNameRegistry"> <authority name="LocalSTS"> <keys> <add thumbprint="9B74CB2F320F7AAFC156E1252270B1DC01EF40D0" /> </keys> <validIssuers> <add name="LocalSTS" /> </validIssuers> </authority> </issuerNameRegistry> </identityConfiguration>
我的< system.identityModel.services>如下:
<system.identityModel.services> <federationConfiguration> <cookieHandler requireSsl="false" /> <wsFederation passiveRedirectEnabled="true" issuer="http://localhost:14691/wsFederationSTS/Issue" realm="http://localhost/" reply="http://localhost/sitecore modules/fedauthenticator/sso" requireHttps="false" /> </federationConfiguration> </system.identityModel.services>
我在< system.webServer>< modules>下添加了相关模块(WSFederationAuthenticationModule,SessionAuthenticationModule). :
<add type="Sitecore.Web.RewriteModule, Sitecore.Kernel" name="SitecoreRewriteModule" /> <add type="Sitecore.Nexus.Web.HttpModule,Sitecore.Nexus" name="SitecoreHttpModule" /> <add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> <add name="SessionAuthenticationModule" type="FedAuthenticator.Authentication.WSSessionAuthenticationModule, FedAuthenticator" preCondition="managedHandler" />
我看到的行为如下:
>用户导航到受Sitecore保护的页面
> WIF FAM模块触发并在EndRequest处确定返回401状态
> WIF FAM根据设置重定向到LocalSTS IdP(使用适当的查询字符串)
> Javascript自动提交表单 – 我已经在浏览器中禁用了JS来测试它,但它有效
> LocalSTS页面在回复属性中指定的URL,在表单的wresult字段中包含令牌信息
这就是问题发生的地方.我的理解是FAM挂钩AuthenticateRequest事件,然后继续检测安全令牌(通过wa和wresult表单字段的存在和值)并解码SSO令牌.
我的问题是这种情况永远不会发生 – 我已经启用了跟踪并覆盖了WSFederationAuthenticationModule来检查,虽然它第一次正确检测到事件并调用了CreateSignInRequest和RedirectToIdentityProvider步骤,但后续对站点的POST(包含令牌)却没有激活AuthenticateRequest,因此FAM不会检测,创建cookie或为请求分配正确的IPrincipal.
这导致无限循环,其中请求接收401,302被重定向到LocalSTS SSO页面,其提交POST,发送到Sitecore SSO页面,其递送401等.
任何人都可以提供一些我缺少的东西,或其他任何可能阻碍FAM检测其中包含令牌信息的POST请求的内容吗?
令人尴尬的是,回答我自己的问题 – 发生这种情况的原因是响应参数将SSO表单POST指向Sitecore响应的URL,并重定向到NotFound页面(即,Sitecore已解析为POST目标不存在).由于NotFound页面没有任何安全性,因此AuthenticateRequest未触发.
我还没有弄清楚为什么NotFound页面导致重定向回到SSO页面 – 但至少现在,一旦我在响应配置字段中更正了不正确的值,FAM会检测到令牌并正确处理以供日后使用模块(SAM等).
编辑 – 找到重定向循环的原因
重定向循环是由web.config中的错误设置引起的,如下所示:
<authorization> <deny users="?"/> </authorization>
这意味着令牌被发布到NotFound页面,Sitecore显然拦截了请求,因此没有触发FAM,因此用户未经过身份验证.这导致了一个401响应代码(由于deny语句),它启动了SSO重定向 – 创建一个循环.