4 Stimmen

Thinktecture - Nicht in der Lage, ein verschlüsseltes SAML-Sicherheitstoken in der Web API zu verarbeiten

In .net Web API, wie kann ich Thinktechture Saml2SecurityTokenHandler konfigurieren, um ein X509-Zertifikat zu verwenden, um ein verschlüsseltes SAML2-Sicherheitstoken zu verarbeiten (es entschlüsseln, bevor es validiert wird).

Das Token wurde vom Identity Server verschlüsselt, indem der RP so konfiguriert wurde, dass er das Zertifikat zur Verschlüsselung verwendet.

Im Folgenden finden Sie die funktionierende Konfiguration (ohne die Behandlung eines verschlüsselten Tokens) aus den Thinktechture-Beispielen:

  #region IdentityServer SAML
  authentication.AddSaml2(
                issuerThumbprint: Constants.IdSrv.SigningCertThumbprint,
                issuerName: Constants.IdSrv.IssuerUri,
                audienceUri: Constants.Realm,
                certificateValidator: X509CertificateValidator.None,
                options: AuthenticationOptions.ForAuthorizationHeader(Constants.IdSrv.SamlScheme),
                scheme: AuthenticationScheme.SchemeOnly(Constants.IdSrv.SamlScheme));
  #endregion

1voto

JonathanN Punkte 672

Um verschlüsselte Token mit Web API zu aktivieren, fand ich das hilfreich: http://www.alexthissen.nl/blogs/main/archive/2011/07/18/using-active-profile-for.aspx

Gegen Ende finden Sie den Code, der die ServiceTokenResolver-Eigenschaft auf der Configuration-Eigenschaft einer SecurityTokenHandlerCollection unter Verwendung eines X509-Zertifikats aus dem LocalMachine-Speicher festlegt. Die Configuration-Eigenschaft ist eine SecurityTokenHandlerConfiguration, die einer der Parameter für eine Überladung der AddSaml2-Erweiterungsmethode in AuthenticationConfigurationExtensionsCore.cs aus der ThinkTecture.IdentityModel-Quelle ist. Im Folgenden finden Sie, was ich verwendet habe.

var registry = new ConfigurationBasedIssuerNameRegistry();
registry.AddTrustedIssuer(Constants.IdSrv.SigningCertThumbprint, Constants.IdSrv.IssuerUri);

var handlerConfig = new SecurityTokenHandlerConfiguration();
handlerConfig.AudienceRestriction.AllowedAudienceUris.Add(new Uri(Constants.Realm));
handlerConfig.IssuerNameRegistry = registry;
handlerConfig.CertificateValidator = GetX509CertificateValidatorSetting();

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certificates = store.Certificates;
X509Certificate2Collection matchingCertificates = certificates.Find(
    X509FindType.FindBySubjectDistinguishedName,
    "CN=RPTokenCertificate", false);
X509Certificate2 certificate = certificates[0];

List serviceTokens = new List();
serviceTokens.Add(new X509SecurityToken(certificate));
SecurityTokenResolver serviceResolver =
    SecurityTokenResolver.CreateDefaultSecurityTokenResolver(
        serviceTokens.AsReadOnly(), false);
handlerConfig.ServiceTokenResolver = serviceResolver;

authentication.AddSaml2(handlerConfig, 
    AuthenticationOptions.ForAuthorizationHeader(SamlScheme), 
    AuthenticationScheme.SchemeOnly(SamlScheme));

Ich hoffe, das hilft.

0voto

Sam Punkte 11

Habe diese Antwort von jemandem bekommen:

    public ClaimsIdentity DecryptToken(string token)
    {
        XmlReader rdr = XmlReader.Create(new StringReader(token));

        SecurityTokenHandlerConfiguration config = new SecurityTokenHandlerConfiguration();
        config.AudienceRestriction.AllowedAudienceUris.Add(new Uri("urn:yourRP"));
        config.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
        config.RevocationMode = X509RevocationMode.NoCheck;

        ConfigurationBasedIssuerNameRegistry inr = new ConfigurationBasedIssuerNameRegistry();
        X509Certificate2 cert = new X509Certificate2(pathToSigningCert);
        inr.AddTrustedIssuer(cert.Thumbprint, "STS Name");

        config.IssuerNameRegistry = inr;
        config.CertificateValidator = System.IdentityModel.Selectors.X509CertificateValidator.None;

        SecurityTokenHandlerCollection handlers = System.IdentityModel.Tokens.SecurityTokenHandlerCollection.CreateDefaultSecurityTokenHandlerCollection(config);

        if (handlers.CanReadToken(rdr))
        {
            var tmpToken = handlers.ReadToken(rdr);
            var claimsIds = handlers.ValidateToken(tmpToken);
            var id = claimsIds.FirstOrDefault();
        }
    }

nicht sicher, ob das hilft.

welchen Wert haben Sie als Issuer-Namen verwendet? Den Namen der Website, die Sie in IIS eingerichtet haben? Oder den Wert, den Sie im Feld "Site ID" auf der Seite "Allgemeine Konfiguration" des Verwaltungsbereichs von IdentityServer eingegeben haben?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X