我们的网站在两个独立的域中运行,一个是安全 API,另一个是前端网站。我们希望能够使用当前登录的用户凭据从网站向 API 发出 ajax 请求。
为此,我做了所有必要的 CORS 位,以便能够将我们的 cookie 传递给 API,但是当 API 尝试处理 cookie 时,它无法解密它。我的理解是,这是因为领域不正确匹配。
我尝试这样做时得到的错误如下:
InvalidOperationException:ID1073:尝试使用 ProtectedData API 解密 cookie 时发生 CryptographicException(有关详细信息,请参阅内部异常)。如果您使用的是 IIS 7.5,这可能是由于应用程序池上的 loadUserProfile 设置设置为 false。
如果我使用 :1444 领域的 cookie 手动发出相同的请求,一切正常(所以我认为 loadUserProfile 的东西是红鲱鱼)。
我认为问题在于我不能将此 cookie 重用于另一个领域。但如果是这种情况,我该如何在 javascript 中执行此委托?实际上是否有可能不将用户重定向到 STS 以获取另一个领域的 cookie?有没有更好的方法来处理这个 javascript 委托?
有用的支持数据:
我们API端的WIF配置:
<modules runAllManagedModulesForAllRequests="true">
<add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler" />
<add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler" />
</modules>
...
<microsoft.identityModel>
<service>
<securityTokenHandlers>
<add type="Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<sessionTokenRequirement lifetime="1:00" />
</add>
</securityTokenHandlers>
<audienceUris>
<add value="http://localhost:1444/" />
</audienceUris>
<federatedAuthentication>
<wsFederation passiveRedirectEnabled="true" issuer="http://localhost:1339/account/sign-in" realm="http://localhost:1444/" requireHttps="false" persistentCookiesOnPassiveRedirects="false" />
<cookieHandler requireSsl="false" path="/" name="TheCookieMonster" persistentSessionLifetime="60" />
</federatedAuthentication>
<applicationService>
<claimTypeRequired>
<!--This claim gets mapped to the User.Identity.Name-->
<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" optional="false" />
<!--Some Other Custom claims-->
</claimTypeRequired>
</applicationService>
<issuerNameRegistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<trustedIssuers>
<add thumbprint="a_thumbprint_key_for_our_cert" name="http://localhost:1339/" />
</trustedIssuers>
</issuerNameRegistry>
</service>
</microsoft.identityModel>
网站端WIF的配置:
(相同但带有:1337)
<modules runAllManagedModulesForAllRequests="true">
<add name="WSFederationAuthenticationModule" type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler" />
<add name="SessionAuthenticationModule" type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler" />
</modules>
...
<microsoft.identityModel>
<service>
<securityTokenHandlers>
<add type="Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<sessionTokenRequirement lifetime="1:00" />
</add>
</securityTokenHandlers>
<audienceUris>
<add value="http://localhost:1337/" />
</audienceUris>
<federatedAuthentication>
<wsFederation passiveRedirectEnabled="true" issuer="http://localhost:1339/account/sign-in" realm="http://localhost:1337/" requireHttps="false" persistentCookiesOnPassiveRedirects="false" />
<cookieHandler requireSsl="false" path="/" name="TheCookieMonster" persistentSessionLifetime="60" />
</federatedAuthentication>
<applicationService>
<claimTypeRequired>
<!--This claim gets mapped to the User.Identity.Name-->
<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" optional="false" />
<!--Some Custom claims-->
</claimTypeRequired>
</applicationService>
<issuerNameRegistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<trustedIssuers>
<add thumbprint="a_thumbprint_key_for_our_cert" name="http://localhost:1339/" />
</trustedIssuers>
</issuerNameRegistry>
</service>
</microsoft.identityModel>
网络选项卡的外观:
我认为这被取消了,因为 JS 检测到某种安全废话正在发生。
- 机器密钥在两个站点之间共享
- 两者都运行 WIF 3.5