2011-07-25 2 views
2

Je pensais avoir compris cela, mais je suis perplexe et j'espère que quelqu'un ici peut ajouter de la clarté.WIF ID 4036 Erreur - dépannage, idées?

J'ai écrit un STS personnalisé. J'ai écrit une partie de confiance distincte et simple qui produit les revendications de la STS. Cela fonctionne sur ma machine locale. Je peux le faire fonctionner si je déploie le STS et le RP sur le même serveur. Cependant, en essayant d'exécuter un RP à partir de ma boîte de dev, j'obtiens des erreurs ID4036 (ID4036: La clé nécessaire pour déchiffrer le jeton de sécurité chiffré n'a pas pu être résolue avec l'identificateur de clé de sécurité suivant 'CN = Cin1Web07-Dev. paycor-test.com116108771XXXXXX3182074711bOkGGQaGymVHZXc9v8AsLyx/Qiy0fhmKKu88BVinXvx4ySzBMqmb1IiY7DSFAXR1PeFevfTxmzmZwu1ztPyJWpNV0LzKnVbxrqChH7iREfYhp5EHUzF0tCdJ49Q/XL3laN/Nh971hxPzj0rBQIIJ8bK/vW70x6gCkIj4Wy50Qow = ». Assurez-vous que la SecurityTokenResolver est remplie avec la clé requise)

J'ai essayé de trouver des réponses dans les livres de WIF Guide des revendications et la programmation, mais pas de chance. Aussi, j'ai trouvé ce site: http://consultingblogs.emc.com/simonevans/archive/2010/11/19/common-windows-identity-foundation-ws-federation-exceptions-explained.aspx mais ça ne m'amène pas plus loin non plus.

Si quelqu'un a des conseils de dépannage ou des idées, j'apprécierais. Voici mes coordonnées de ce que je fais:

Le STS signe le certificat avec un simple cn = LocalHost, ce paramètre est réglé ici:

public static MetadataBase GetFederationMetadata() 
{ 
    string endpointId = WebConfigurationManager.AppSettings["ActiveSTSUrl"]; 
    EntityDescriptor metadata = new EntityDescriptor(); 
    metadata.EntityId = new EntityId(endpointId); 

    // Define the signing key 
    X509Certificate2 cert = CertificateUtil.GetCertificate(StoreName.My, StoreLocation.LocalMachine, GetCertificateNameForSigningMetadata()); 
    metadata.SigningCredentials = new X509SigningCredentials(cert); 

    // Create role descriptor for security token service 
    SecurityTokenServiceDescriptor stsRole = new SecurityTokenServiceDescriptor(); 
    stsRole.ProtocolsSupported.Add(new Uri(WSFederationMetadataConstants.Namespace)); 
    metadata.RoleDescriptors.Add(stsRole); 

    // Add a contact name 
    ContactPerson person = new ContactPerson(ContactType.Administrative); 
    person.GivenName = "contactName"; 
    stsRole.Contacts.Add(person); 

    // Include key identifier for signing key in metadata 
    SecurityKeyIdentifierClause clause = new X509RawDataKeyIdentifierClause(cert); 
    SecurityKeyIdentifier ski = new SecurityKeyIdentifier(clause); 
    KeyDescriptor signingKey = new KeyDescriptor(ski); 
    signingKey.Use = KeyType.Signing; 
    stsRole.Keys.Add(signingKey); 

    // Add endpoints 
    string activeSTSUrl = WebConfigurationManager.AppSettings["ActiveSTSUrl"]; 
    EndpointAddress endpointAddress = new EndpointAddress(new Uri(activeSTSUrl), 
               null, 
               null, GetMetadataReader(activeSTSUrl), null); 
    stsRole.SecurityTokenServiceEndpoints.Add(endpointAddress); 

    ExposeClaimTypesOffered(stsRole); 

    return metadata; 
} 

et mis ici:

public MembershipSTSConfiguration() : base() 
{ 
    X509Certificate2 signingCert = CertificateUtil.GetCertificate(
     StoreName.My, 
     StoreLocation.LocalMachine, 
     Common.GetCertificateNameForSigningMetadata()); 

    this.SigningCredentials = new X509SigningCredentials(signingCert); 
    this.SecurityTokenService = typeof(MembershipSTS); 
    this.TokenIssuerName = "MembershipSTS"; 
} 

J'ai appelé la méthode GetCertificateNameForSigningMetadata, mais je crois comprendre que cela signe également le jeton.

Dans mon RP, j'ai cette section - et l'empreinte correspond l'empreinte du cn = localhost du serveur STS:

<issuerNameRegistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"> 
    <trustedIssuers> 
     <add thumbprint="A6F68xxxxxxxx575EBDC" name="http://cin1web07-dev.paycor-test.com:8080/PaycorAuthServices/PassiveSTS.aspx" /> 
    </trustedIssuers> 
    </issuerNameRegistry> 

Je crois que tout est correctement configuré. Cependant, la partie de cryptage est où je pense qu'il y a un problème. C'est dans le web.config du RP. L'Empreinte ci-dessous référence un certificat appelé RelyingParty.MyOrg.

<serviceCertificate> 
    <certificateReference x509FindType="FindByThumbprint" findValue="AA310FF423XXXXXXXX910F9C69" storeLocation="LocalMachine" storeName="My" /> 
    </serviceCertificate> 

Le certificat est installé sur ma machine de développement (le RP) avec la clé privée. L'autorité de certification existe également sur ma machine. J'ai exporté le certificat vers le serveur de dev et le cert CA. Ils semblent être configurés correctement. Dans le GetScope des STS, j'ai ceci:

protected override Scope GetScope(IClaimsPrincipal principal, RequestSecurityToken request) 
{ 
    Scope scope = new Scope(request.AppliesTo.Uri.AbsoluteUri, SecurityTokenServiceConfiguration.SigningCredentials); 
    scope.EncryptingCredentials = new X509EncryptingCredentials(CertificateUtil.GetCertificate(StoreName.My, StoreLocation.LocalMachine, 
       System.Configuration.ConfigurationManager.AppSettings["CertificateNameForEncryptingToken"])); 

    scope.ReplyToAddress = scope.AppliesToAddress + "/Default.aspx"; 
    return scope; 
} 

Les cartes AppSetting à cn = RelyingParty.MyOrg, et trouve le certificat, je crois (parce que si je change 1 lettre, je reçois un autre « peut » t find cert 'erreur).

Malgré tout cela, je reçois l'ID4036 sur ma boîte de dev quand j'utilise le STS.

Voici la partie qui me dérange vraiment - après le passage au cert RelyingParty.MyOrg, le RP sur le serveur de dev fonctionne toujours - même s'il est défini sur l'ancien cn = localhost et n'a pas la clé privée pour le cn = RelyingParty.MyOrg.

Donc, clairement, je ne comprends pas certaines de ces config. Je m'excuse pour le long post, mais je suis vraiment désespérée de conclure. Si quelqu'un a des suggestions, je l'apprécierais grandement.

Répondre

2

Il semble que votre boîte de dev ne dispose pas de la clé privée dont le RP a besoin pour déchiffrer le jeton.Le STS n'a besoin que de la clé publique pour chiffrer le jeton, c'est pourquoi il n'échoue pas. Si vous avez installé la clé privée sur le serveur de dev, il se peut que les autorisations ne soient pas correctement définies sur la clé privée et que le RP ne puisse pas le lire.

+0

Je crois que cela se produit également lorsque le certificat utilisé pour émettre le certificat de chiffrement ne peut pas être vérifié. Dans la publication référencée, le certificat de chiffrement est placé dans le magasin My. Si déplacé au magasin de racine il semble éclaircir ce problème, ou a fait de mon côté. –

+0

J'ai le même problème et même les permissions sont correctes. toujours pas de chance :( – user3311522

+0

J'ai la clé privée installée sur ma boîte de dev, j'ai le cert en root et le mien, mais toujours pas de dé. –

1

Il est une longue histoire - mais la STS a été fait chiffrant avec la mauvaise clé ...

Comme pour le dépannage, c'est un véritable PITA à résoudre, mais vous devez vraiment regarder les premières demandes de jeton.