我正在尝试将SAML2 IdP Salesforce
配置为IdentityServer3中的外部提供程序。我正在使用SustainSys/Saml2库。因此,出于测试目的,我下载了SampleIdentityServer3。并按如下所示配置SAML2 IdP
private void ConfigureSaml2(IAppBuilder app, string signInAsType)
{
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
var options = new Saml2AuthenticationOptions(false)
{
SPOptions = new SPOptions
{
EntityId = new EntityId("http://localhost:4589/IdSrv3/Saml2"),
MinIncomingSigningAlgorithm = "http://www.w3.org/2000/09/xmldsig#rsa-sha1"
},
SignInAsAuthenticationType = signInAsType,
Caption = "SAML2p",
};
UseIdSrv3LogoutOnFederatedLogout(app, options);
options.SPOptions.ServiceCertificates.Add(new X509Certificate2(
AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "/App_Data/Sustainsys.Saml2.Tests.pfx"));
var idp = new IdentityProvider(
new EntityId("https://XXXXXX-dev-ed.my.salesforce.com"),
options.SPOptions)
{
MetadataLocation = "https://XXXXXX-dev-ed.my.salesforce.com/.well-known/samlidp.xml",
LoadMetadata = true,
};
options.IdentityProviders.Add(idp);
app.UseSaml2Authentication(options);
}
请注意,如果我没有将MinIncomingSigningAlgorithm
设置为sh1,那么SustainSys库将引发错误。
Sustainsys.Saml2.Exceptions.InvalidSignatureException:签名 算法http://www.w3.org/2000/09/xmldsig#rsa-sha1比 最低接受 http://www.w3.org/2001/04/xmldsig-more#rsa-sha256。如果你想 允许使用此签名算法,请使用minIncomingSigningAlgorithm 配置属性。
所以我将MinIncomingSigningAlgorithm
设置为"http://www.w3.org/2000/09/xmldsig#rsa-sha1"
以消除错误。
但是然后我得到了另一个错误
Sustainsys.Saml2.Exceptions.InvalidSignatureException:签名 已使用签名中包含的密钥正确验证,但是 密钥不受信任。
基于问题#493 #735,元数据中的证书必须与SAML2响应中的证书匹配。
在元数据中,证书为(注意起始值和结束值)
<ds:X509Data>
<ds:X509Certificate>
MIIGk... removed from brevity....tmv6J1g==
</ds:X509Certificate>
</ds:X509Data>
但是在SAML2响应中(由SustainSys库记录的响应)
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" Destination="http://localhost:4589/IdSrv3/Saml2/Acs" ID="_19fd2d8d9aab0401f56fXXXXXXXXX" InResponseTo="id473a52c49f194bXXXXXXXXX" IssueInstant="2018-08-27T20:10:04.296Z" Version="2.0">
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://XXXXXXX-dev-ed.my.salesforce.com</saml:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#_19fd2d8d9aab0401f56f642dXXXXXXXXXXXXX">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"><ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="ds saml samlp" /></ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>fQiiyd0T57Ztr5BAfMFe9MTrhY0=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
B6hndlsBgY45J+hm8My2gPVo....removed for brevity....YT88ajt7jQ==
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIIENz... remove for brevity....y2Ul24Jyc4V/jJN
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<samlp:Status>
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:AuthnFailed" />
</samlp:Status>
</samlp:Response>
查看元数据和SAML2响应中的X509Certificate
值不匹配。
问题
SAML2响应中的X509Certificate
值是否应该与元数据中的X509Certificate
值匹配?如果是,为什么SustainSys库不能始终使用SAML2响应中的X509Certificate
值?
更新
为了查看匹配的值是否可行,我将来自SAML2响应的证书值保存到单独的.cer
文件中。然后在KeyInfoSerializer.cs文件中更新了ReadX509Certificate
方法(这是从元数据加载证书的方法)
private static SecurityKeyIdentifierClause ReadX509Certificate(XmlReader reader)
{
reader.ReadStartElement("X509Certificate", SignedXml.XmlDsigNamespaceUrl);
((XmlDictionaryReader)reader).ReadContentAsString();
var cer = new X509Certificate2(AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "/App_Data/salesforcepublickey.cer");
var clause = new X509RawDataKeyIdentifierClause(cer);
reader.ReadEndElement();
return clause;
}
但是,它仍然会引发错误The signature verified correctly with the key contained in the signature, but that key is not trusted.
答案 0 :(得分:2)
找到了。
这是Salesforce方面的问题。在Saleforce中,当我查看日志Identity->Identity Provider Event Log
时看到错误Error: User does not have access to this service provider
为此,未向用户授予权限。即使用户是系统管理员,默认情况下也不授予对Connected App的访问权限。要授予权限,请转到``管理用户->用户'',然后在要测试的用户上单击编辑。单击配置文件名称链接,例如系统管理员。这将转到个人资料页面。您可以在下面滚动到“已连接的应用程序访问”,然后会看到未提供访问权限。通过单击页面顶部的编辑配置文件来授予访问权限。
答案 1 :(得分:0)
与此无关,但是当我们搜索错误时,首先出现此问题,因此请在此处发布解决方案。我们已经与ASP.net应用程序中的第三方提供商的kentor auth服务库集成在一起,但由于上述错误而失败。
问题在于IIS无法以某种方式到达证书存储。
我们为网站启用了loadUserProfile
上的Application Pool
设置,并使其能够完美运行。我们将其应用于Windows Server 2016。