O emissor do token não é um emissor confiável
-
29-09-2020 - |
Pergunta
Estou tentando resolver esse problema há um tempo, sem sorte, talvez alguém com mais experiência em Sharepoint consiga identificar meu problema.
O stacktrace de exceção nos logs do Sharepoint é assim:
System.IdentityModel.Tokens.SecurityTokenException: The issuer of the token is not a trusted issuer.
at Microsoft.SharePoint.IdentityModel.SPLocalIssuerNameRegistry.GetIssuerName(SecurityToken securityToken)
at Microsoft.IdentityModel.Tokens.Saml11.Saml11SecurityTokenHandler.CreateClaims(SamlSecurityToken samlSecurityToken)
at Microsoft.IdentityModel.Tokens.Saml11.Saml11SecurityTokenHandler.ValidateToken(SecurityToken token)
at Microsoft.IdentityModel.Tokens.SecurityTokenHandlerCollection.ValidateToken(SecurityToken token)
at Microsoft.IdentityModel.Web.TokenReceiver.AuthenticateToken(SecurityToken token, Boolean ensureBearerToken, String endpointUri)
at Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.SignInWithResponseMessage(HttpRequest request)
at Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs args)
at Microsoft.SharePoint.IdentityModel.SPFederationAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs eventArgs)
at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Eu olhei o código descompilado, está assim:
if (!accessProvider.SigningCertificate.Equals((X509Certificate) x509SecurityToken.Certificate))
throw new SecurityTokenException(SPResource.GetString("IssuerIsNotTrusted"));
Portanto, parece que o token de segurança recebido e os certificados do provedor de acesso não correspondem.Fui mais longe, fiz crash dump, carreguei no windbg e tentei descobrir qual certificado tem accessProvider, não tenho certeza se estava pesquisando no lugar certo, mas se estava, então tinha certificado errado - o assunto era CN=SharePoint Security Token Service, OU=SharePoint, O=Microsoft, C=US
, claramente não é o meu configurado.
Eu estava registrando meu provedor de identidade assim:
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2("C:\temp\wcfsts.dev.cer")
$map1 = New-SPClaimTypeMapping -IncomingClaimType "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress" -IncomingClaimTypeDisplayName "Display Name" –SameAsIncoming
$realm = "http://sp2013.testweb.local"
$ap = New-SPTrustedIdentityTokenIssuer -Name "WSFederationSTS" -Description "WCF STS." –Realm $realm -ClaimsMappings $map1 -ImportTrustCertificate $cert -SignInUrl "http://wcfsts.dev/WSFederationSecurityTokenService.svc/Issue" -IdentifierClaim $map1.InputClaimType
Também registrei certificado com New-SPTrustedRootAuthority
.
Solução
Encontrei o problema acidentalmente, observando o que poderia ter feito de errado.
eu estava olhando para Passo a passo de reivindicações e percebi que eles registravam o emissor do token usando código C#, então decidiram fazer o mesmo e usaram o domínio do provedor "https://intranet.contoso.com/_trust/", então mudei para ter meu domínio, deixando a parte "_trust" - e começou a funcionar, então a exceção nos logs era muito enganosa.
Depois disso, descobri postagem no blog com o mesmo problema, me perguntando por que não percebi isso antes.
Outras dicas
Eu estava seguindo algumas instruções deste link:https://support.microsoft.com/en-us/help/3042604/the-convert-spwebapplication-command-cannot-convert-from-windows-claim
Ele usou o seguinte formato para o comando New-SPTrustedIdentityTokenIssuer:
$ap = New-SPTrustedIdentityTokenIssuer -Name $tokenIdentityProviderName -Description $TrustedIdentityTokenIssuerDescription -realm $siteRealm -ImportTrustCertificate $adfsCert -SignInUrl $signInUrl -UseDefaultConfiguration -IdentifierClaimIs EMAIL -RegisteredIssuerName $siteRealm
Eu não tinha certeza do que colocar em RegisteredIssuerName e já o havia deixado em branco quando estava funcionando, mas, neste caso, configurei-o como o mesmo que $tokenIdentityProviderName.
Comecei a receber o erro "O emissor do token não é um emissor confiável" depois disso.
Limpei o valor de RegisteredIssuerName:
Set-SPTrustedIdentityTokenIssuer -Identity $ap -RegisteredIssuerName ""
E isso resolveu o problema para mim.
Acredito que para que RegisteredIssuerName funcione, pode ser necessário adicionar uma entrada issuerNameRegistry ao web.config para especificar emissores de token confiáveis.
<issuerNameRegistry
type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry,
Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35">
<trustedIssuers>
<add thumbprint="99fcfe2c70ebb571020ca8aa1b7633dfe1fa1d58" name="http://localhost:48924/WingtipSTS/" />
</trustedIssuers>
</issuerNameRegistry>
Fonte adicional:https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-2010/ff955607(v=office.14)