Megosztás:


SAML-jogkivonat-szolgáltató

Ez a minta bemutatja, hogyan implementálhat egyéni ügyfél SAML-jogkivonat-szolgáltatót. A Windows Communication Foundation (WCF) hitelesítési token szolgáltatója a hitelesítő adatok megadására szolgál a biztonsági infrastruktúra számára. A jogkivonat-szolgáltató általában megvizsgálja a célt, és megfelelő hitelesítő adatokat ad ki, hogy a biztonsági infrastruktúra biztonságossá tegye az üzenetet. A WCF az alapértelmezett Credential Manager-jogkivonat-szolgáltatóval szállít. A WCF egy CardSpace-jogkivonat-szolgáltatóval is rendelkezik. A speciális token szolgáltatók a következő esetekben hasznosak:

  • Ha olyan hitelesítőadat-tárolóval rendelkezik, amellyel ezek a jogkivonat-szolgáltatók nem működhetnek.

  • Ha saját egyéni mechanizmust szeretne biztosítani a hitelesítő adatok átalakításához attól a ponttól kezdve, amikor a felhasználó megadja a részleteket, hogy a WCF ügyfél-keretrendszer mikor használja a hitelesítő adatokat.

  • Ha egyéni jogkivonatot hoz létre.

Ez a minta bemutatja, hogyan hozhat létre egyéni jogkivonat-szolgáltatót, amely lehetővé teszi a WCF-ügyfél keretrendszerén kívülről beszerzett SAML-jogkivonat használatát.

Összegzésként ez a minta a következőket mutatja be:

  • Hogyan állítható be egy ügyfél konfigurációja egyéni jogkivonat-szolgáltatóval?

  • Hogyan továbbítható egy SAML-jogkivonat az egyéni ügyfél hitelesítő adatainak.

  • Hogyan kerül az SAML token biztosításra a WCF-ügyfél-keretrendszernek.

  • Hogyan hitelesíti a kiszolgálót az ügyfél a kiszolgáló X.509-tanúsítványával.

A szolgáltatás két végpontot tesz elérhetővé a szolgáltatással való kommunikációhoz, a App.configkonfigurációs fájllal definiálva. Minden végpont egy címből, egy kötésből és egy szerződésből áll. A kötés egy szabványos , üzenetbiztonságot használó szabványsal wsFederationHttpBindingvan konfigurálva. Az egyik végpont elvárja, hogy az ügyfél egy szimmetrikus ellenőrzőkulcsot használó SAML-jogkivonattal hitelesítse magát, a másik pedig egy aszimmetrikus ellenőrzőkulcsot használó SAML-jogkivonattal való hitelesítést. A szolgáltatás viselkedéssel is konfigurálja a szolgáltatástanúsítványt serviceCredentials . A serviceCredentials viselkedés lehetővé teszi egy szolgáltatástanúsítvány konfigurálását. Az ügyfél szolgáltatástanúsítványt használ a szolgáltatás hitelesítéséhez és az üzenetvédelem biztosításához. Az alábbi konfiguráció a mintabeállítás során telepített "localhost" tanúsítványra hivatkozik a jelen témakör végén található telepítési utasításokban leírtak szerint. A serviceCredentials viselkedés lehetővé teszi az SAML-jogkivonatok aláírására megbízható tanúsítványok konfigurálását is. Az alábbi konfiguráció a minta során telepített Alice-tanúsítványra hivatkozik.

<system.serviceModel>
 <services>
  <service
          name="Microsoft.ServiceModel.Samples.CalculatorService"
          behaviorConfiguration="CalculatorServiceBehavior">
   <host>
    <baseAddresses>
     <!-- configure base address provided by host -->
     <add
  baseAddress="http://localhost:8000/servicemodelsamples/service/" />
    </baseAddresses>
   </host>
   <!-- use base address provided by host -->
   <!-- Endpoint that expect SAML tokens with Symmetric proof keys -->
   <endpoint address="calc/symm"
             binding="wsFederationHttpBinding"
             bindingConfiguration="Binding1"
             contract="Microsoft.ServiceModel.Samples.ICalculator" />
   <!-- Endpoint that expect SAML tokens with Asymmetric proof keys -->
   <endpoint address="calc/asymm"
             binding="wsFederationHttpBinding"
             bindingConfiguration="Binding2"
             contract="Microsoft.ServiceModel.Samples.ICalculator" />
  </service>
 </services>

 <bindings>
  <wsFederationHttpBinding>
   <!-- Binding that expect SAML tokens with Symmetric proof keys -->
   <binding name="Binding1">
    <security mode="Message">
     <message negotiateServiceCredential ="false"
              issuedKeyType="SymmetricKey"
              issuedTokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1"  />
    </security>
   </binding>
   <!-- Binding that expect SAML tokens with Asymmetric proof keys -->
   <binding name="Binding2">
    <security mode="Message">
     <message negotiateServiceCredential ="false"
              issuedKeyType="AsymmetricKey"
              issuedTokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1"  />
    </security>
   </binding>
  </wsFederationHttpBinding>
 </bindings>

 <behaviors>
  <serviceBehaviors>
   <behavior name="CalculatorServiceBehavior">
    <!--
    The serviceCredentials behavior allows one to define a service certificate.
    A service certificate is used by a client to authenticate the service and provide message protection.
    This configuration references the "localhost" certificate installed during the setup instructions.
    -->
    <serviceCredentials>
     <!-- Set allowUntrustedRsaIssuers to true to allow self-signed, asymmetric key based SAML tokens -->
     <issuedTokenAuthentication allowUntrustedRsaIssuers ="true" >
      <!-- Add Alice to the list of certs trusted to issue SAML tokens -->
      <knownCertificates>
       <add storeLocation="LocalMachine"
            storeName="TrustedPeople"
            x509FindType="FindBySubjectName"
            findValue="Alice"/>
      </knownCertificates>
     </issuedTokenAuthentication>
     <serviceCertificate storeLocation="LocalMachine"
                         storeName="My"
                         x509FindType="FindBySubjectName"
                         findValue="localhost"  />
    </serviceCredentials>
   </behavior>
  </serviceBehaviors>
 </behaviors>

</system.serviceModel>

Az alábbi lépések bemutatják, hogyan fejleszthet egyéni SAML-jogkivonat-szolgáltatót, és hogyan integrálhatja azt a WCF: biztonsági keretrendszerrel:

  1. Egyéni SAML-jogkivonat-szolgáltatót írjon.

    A minta egy egyéni SAML-jogkivonat-szolgáltatót implementál, amely egy biztonsági jogkivonatot ad vissza a létrehozáskor megadott SAML-megállapítás alapján.

    A feladat végrehajtásához az SecurityTokenProvider osztályból származtatott egyéni jogkivonat-szolgáltató felülbírálja a GetTokenCore metódust. Ez az eljárás létrehoz és visszaad egy új SecurityToken-t.

    protected override SecurityToken GetTokenCore(TimeSpan timeout)
    {
     // Create a SamlSecurityToken from the provided assertion
     SamlSecurityToken samlToken = new SamlSecurityToken(assertion);
    
     // Create a SecurityTokenSerializer that will be used to
     // serialize the SamlSecurityToken
     WSSecurityTokenSerializer ser = new WSSecurityTokenSerializer();
     // Create a memory stream to write the serialized token into
     // Use an initial size of 64Kb
     MemoryStream s = new MemoryStream(UInt16.MaxValue);
    
     // Create an XmlWriter over the stream
     XmlWriter xw = XmlWriter.Create(s);
    
     // Write the SamlSecurityToken into the stream
     ser.WriteToken(xw, samlToken);
    
     // Seek back to the beginning of the stream
     s.Seek(0, SeekOrigin.Begin);
    
     // Load the serialized token into a DOM
     XmlDocument dom = new XmlDocument();
     dom.Load(s);
    
     // Create a KeyIdentifierClause for the SamlSecurityToken
     SamlAssertionKeyIdentifierClause samlKeyIdentifierClause = samlToken.CreateKeyIdentifierClause<SamlAssertionKeyIdentifierClause>();
    
    // Return a GenericXmlToken from the XML for the
    // SamlSecurityToken, the proof token, the valid from and valid
    // until times from the assertion and the key identifier clause
    // created above
    return new GenericXmlSecurityToken(dom.DocumentElement, proofToken, assertion.Conditions.NotBefore, assertion.Conditions.NotOnOrAfter, samlKeyIdentifierClause, samlKeyIdentifierClause, null);
    }
    
  2. Egyéni biztonsági jogkivonat-kezelő készítése.

    A(z) SecurityTokenManager osztályt arra használjuk, hogy létrehozzuk a SecurityTokenProvider metódusba átadott konkrét SecurityTokenRequirement-hez tartozó CreateSecurityTokenProvider objektumokat. A biztonsági jogkivonat-kezelőt arra is használják, hogy jogkivonat-hitelesítőket és jogkivonat-szerializálókat hozzanak létre, de ezeket a funkciókat ez a példa nem tárgyalja. Ebben a mintában az egyéni biztonsági jogkivonat-kezelő az ClientCredentialsSecurityTokenManager osztályból öröklődik, és felülbírálja az CreateSecurityTokenProvider metódust, hogy visszaadja az egyéni SAML-jogkivonat-szolgáltatót, amikor az átadott jogkivonat-követelmények azt jelzik, hogy SAML-jogkivonatot kérnek. Ha az ügyfél-hitelesítő osztály (lásd a 3. lépést) nem adott meg egy állítást, a biztonsági tokenkezelő létrehoz egy megfelelő példányt.

    public class SamlSecurityTokenManager : ClientCredentialsSecurityTokenManager
    {
     SamlClientCredentials samlClientCredentials;
    
     public SamlSecurityTokenManager ( SamlClientCredentials samlClientCredentials)
      : base(samlClientCredentials)
     {
      // Store the creating client credentials
      this.samlClientCredentials = samlClientCredentials;
     }
    
     public override SecurityTokenProvider CreateSecurityTokenProvider ( SecurityTokenRequirement tokenRequirement )
     {
      // If token requirement matches SAML token return the
      // custom SAML token provider
      if (tokenRequirement.TokenType == SecurityTokenTypes.Saml ||
          tokenRequirement.TokenType == "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1")
      {
       // Retrieve the SAML assertion and proof token from the
       // client credentials
       SamlAssertion assertion = this.samlClientCredentials.Assertion;
       SecurityToken prooftoken = this.samlClientCredentials.ProofToken;
    
       // If either the assertion of proof token is null...
       if (assertion == null || prooftoken == null)
       {
        // ...get the SecurityBindingElement and then the
        // specified algorithm suite
        SecurityBindingElement sbe = null;
        SecurityAlgorithmSuite sas = null;
    
        if ( tokenRequirement.TryGetProperty<SecurityBindingElement> ( "http://schemas.microsoft.com/ws/2006/05/servicemodel/securitytokenrequirement/SecurityBindingElement", out sbe))
        {
         sas = sbe.DefaultAlgorithmSuite;
        }
    
        // If the token requirement is for a SymmetricKey based token..
        if (tokenRequirement.KeyType == SecurityKeyType.SymmetricKey)
        {
         // Create a symmetric proof token
         prooftoken = SamlUtilities.CreateSymmetricProofToken ( tokenRequirement.KeySize );
         // and a corresponding assertion based on the claims specified in the client credentials
         assertion = SamlUtilities.CreateSymmetricKeyBasedAssertion ( this.samlClientCredentials.Claims, new X509SecurityToken ( samlClientCredentials.ClientCertificate.Certificate ), new X509SecurityToken ( samlClientCredentials.ServiceCertificate.DefaultCertificate ), (BinarySecretSecurityToken)prooftoken, sas);
        }
        // otherwise...
        else
        {
         // Create an asymmetric proof token
         prooftoken = SamlUtilities.CreateAsymmetricProofToken();
         // and a corresponding assertion based on the claims
         // specified in the client credentials
         assertion = SamlUtilities.CreateAsymmetricKeyBasedAssertion ( this.samlClientCredentials.Claims, prooftoken, sas );
        }
       }
    
       // Create a SamlSecurityTokenProvider based on the assertion and proof token
       return new SamlSecurityTokenProvider(assertion, prooftoken);
      }
      // otherwise use base implementation
      else
      {
       return base.CreateSecurityTokenProvider(tokenRequirement);
      }
    }
    
  3. Egyéni ügyfél-hitelesítő adatok írása.

    Az ügyfél-hitelesítő adatok osztály az ügyfélproxyhoz konfigurált hitelesítő adatokat jelöli, és létrehoz egy biztonsági jogkivonat-kezelőt, amely a jogkivonat-hitelesítők, a jogkivonat-szolgáltatók és a jogkivonat-szerializáló beszerzésére szolgál.

    public class SamlClientCredentials : ClientCredentials
    {
     ClaimSet claims;
     SamlAssertion assertion;
     SecurityToken proofToken;
    
     public SamlClientCredentials() : base()
     {
      // Set SupportInteractive to false to suppress Cardspace UI
      base.SupportInteractive = false;
     }
    
     protected SamlClientCredentials(SamlClientCredentials other) : base ( other )
     {
      // Just do reference copy given sample nature
      this.assertion = other.assertion;
      this.claims = other.claims;
      this.proofToken = other.proofToken;
     }
    
     public SamlAssertion Assertion { get { return assertion; } set { assertion = value; } }
    
     public SecurityToken ProofToken { get { return proofToken; } set { proofToken = value; } }
     public ClaimSet Claims { get { return claims; } set { claims = value; } }
    
     protected override ClientCredentials CloneCore()
     {
      return new SamlClientCredentials(this);
     }
    
     public override SecurityTokenManager CreateSecurityTokenManager()
     {
      // return custom security token manager
      return new SamlSecurityTokenManager(this);
     }
    }
    
  4. Konfigurálja az ügyfelet az egyéni ügyfél hitelesítő adatainak használatára.

    A minta törli az alapértelmezett ügyfél-hitelesítő osztályt, és biztosítja az új ügyfél hitelesítő osztályt, hogy az ügyfél használni tudja az egyéni ügyfél hitelesítő adatait.

    // Create new credentials class
    SamlClientCredentials samlCC = new SamlClientCredentials();
    
    // Set the client certificate. This is the cert that will be used to sign the SAML token in the symmetric proof key case
    samlCC.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "Alice");
    
    // Set the service certificate. This is the cert that will be used to encrypt the proof key in the symmetric proof key case
    samlCC.ServiceCertificate.SetDefaultCertificate(StoreLocation.CurrentUser, StoreName.TrustedPeople, X509FindType.FindBySubjectName, "localhost");
    
    // Create some claims to put in the SAML assertion
    IList<Claim> claims = new List<Claim>();
    claims.Add(Claim.CreateNameClaim(samlCC.ClientCertificate.Certificate.Subject));
    ClaimSet claimset = new DefaultClaimSet(claims);
    samlCC.Claims = claimset;
    
    // set new credentials
    client.ChannelFactory.Endpoint.Behaviors.Remove(typeof(ClientCredentials));
    client.ChannelFactory.Endpoint.Behaviors.Add(samlCC);
    

A szolgáltatásban megjelennek a hívóhoz társított jogcímek. A minta futtatásakor a műveleti kérelmek és a válaszok megjelennek az ügyfélkonzol ablakában. Nyomja le az ENTER billentyűt az ügyfélablakban az ügyfél leállításához.

Batch-fájl beállítása

A mintában szereplő Setup.bat kötegfájl lehetővé teszi, hogy a kiszolgálót a megfelelő tanúsítvánnyal konfigurálja egy olyan saját üzemeltetésű alkalmazás futtatásához, amely kiszolgálótanúsítvány-alapú biztonságot igényel. Ezt a kötegfájlt úgy kell módosítani, hogy a számítógépeken is működjön, vagy nem üzemeltetett esetben működjön.

Az alábbiakban röviden áttekintheti a kötegfájlok különböző szakaszait, hogy azok a megfelelő konfigurációban való futtatásukhoz módosíthatók legyenek.

  • A kiszolgálótanúsítvány létrehozása:

    A Setup.bat kötegfájl alábbi sorai hozzák létre a használni kívánt kiszolgálótanúsítványt. A %SERVER_NAME% változó megadja a kiszolgáló nevét. Módosítsa ezt a változót a saját kiszolgáló nevének megadásához. Ebben a kötegfájlban az alapértelmezett érték a localhost.

    A tanúsítvány a Saját (Személyes) tárolóban, a LocalMachine áruházban található.

    echo ************
    echo Server cert setup starting
    echo %SERVER_NAME%
    echo ************
    echo making server cert
    echo ************
    makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
    
  • A kiszolgálótanúsítvány telepítése az ügyfél megbízható tanúsítványtárolójába:

    A Setup.bat kötegfájl alábbi sorai átmásolják a szerver tanúsítványt az ügyfél megbízható személyek tárhelyébe. Erre a lépésre azért van szükség, mert a Makecert.exe által létrehozott tanúsítványokat az ügyfélrendszer nem implicit módon megbízhatónak minősíti. Ha már rendelkezik olyan tanúsítvánnyal, amely egy ügyfél megbízható főtanúsítványában gyökerezik – például egy Microsoft által kiadott tanúsítványban –, nem szükséges az ügyféltanúsítvány-tároló kiszolgálótanúsítvánnyal való feltöltésének ez a lépése.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r LocalMachine -s TrustedPeople
    
  • A kiállító tanúsítványának létrehozása.

    A Setup.bat kötegfájl alábbi sorai hozzák létre a használni kívánt kiállítói tanúsítványt. A %USER_NAME% változó megadja a kiállító nevét. Módosítsa ezt a változót a saját kiállító nevének megadásához. A kötegfájl alapértelmezett értéke Alice.

    A tanúsítvány a My store-ban, a CurrentUser tároló helyén található.

    echo ************
    echo Server cert setup starting
    echo %SERVER_NAME%
    echo ************
    echo making server cert
    echo ************
    makecert.exe -sr CurrentUser -ss My -a sha1 -n CN=%USER_NAME% -sky exchange -pe
    
  • A kiállító tanúsítvány telepítése a kiszolgáló megbízható tanúsítványtárolójába.

    A Setup.bat kötegfájl alábbi sorai átmásolják a szerver tanúsítványt az ügyfél megbízható személyek tárhelyébe. Erre a lépésre azért van szükség, mert a Makecert.exe által létrehozott tanúsítványokat az ügyfélrendszer nem implicit módon megbízhatónak minősíti. Ha már rendelkezik olyan tanúsítvánnyal, amely egy ügyfél által megbízható főtanúsítványban gyökerezik – például egy Microsoft által kiadott tanúsítványban –, nem szükséges a kiszolgáló tanúsítványtárolójának a kiállítói tanúsítvánnyal való feltöltésének ez a lépése.

    certmgr.exe -add -r CurrentUser -s My -c -n %USER_NAME% -r LocalMachine -s TrustedPeople
    

A minta beállítása és létrehozása

  1. Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták One-Time beállítási eljárását.

  2. A megoldás létrehozásához kövesse a Windows Communication Foundation-minták készítésére vonatkozó utasításokat.

Megjegyzés:

Ha a Svcutil.exe használatával hozza létre újra a minta konfigurációját, mindenképpen módosítsa az ügyfélkonfiguráció végpontnevét az ügyfélkódnak megfelelően.

A minta futtatása ugyanazon a számítógépen

  1. A minta telepítési mappában található Setup.bat fájlt futtassa egy rendszergazdai jogosultságokkal futtatott Visual Studio parancssorból. Ez telepíti a minta futtatásához szükséges összes tanúsítványt.

    Megjegyzés:

    A Setup.bat batch fájl úgy lett kialakítva, hogy a Visual Studio parancssorból fusson. A Visual Studio parancssorában beállított PATH környezeti változó a Setup.bat szkript által igényelt végrehajtható fájlokat tartalmazó könyvtárra mutat.

  2. Indítsa el a Service.exe a service\bin fájlból.

  3. Indítsa el a Client.exe a \client\bin fájlból. Az ügyféltevékenység megjelenik az ügyfélkonzol-alkalmazásban.

  4. Ha az ügyfél és a szolgáltatás nem tud kommunikálni, tekintse meg a WCF minták hibaelhárítási tippeket a éscímsorok alatt.

A minta futtatása számítógépeken

  1. Hozzon létre egy címtárat a szolgáltatásszámítógépen a szolgáltatás bináris fájljaihoz.

  2. Másolja a szolgáltatásprogram fájljait a szolgáltatásszámítógép szolgáltatáskönyvtárába. Másolja a Setup.bat és Cleanup.bat fájlokat is a szolgáltatásszámítógépre.

  3. Rendelkeznie kell egy olyan kiszolgáló-tanúsítvánnyal, amelynek tárgyneve tartalmazza a számítógép teljesen minősített tartománynevét. A Service.exe.config fájlt frissíteni kell, hogy tükrözze ezt az új tanúsítványnevet. A kiszolgálótanúsítványt a Setup.bat kötegfájl módosításával hozhatja létre. Vegye figyelembe, hogy a setup.bat fájlt rendszergazdai jogosultságokkal megnyitott Fejlesztői parancssorban kell futtatni. A %SERVER_NAME% változót arra a teljesen minősített gazdagépnévre kell beállítania, amelyet a szolgáltatás üzemeltetésére használt számítógép használ.

  4. Másolja a kiszolgálótanúsítványt az ügyfél CurrentUser-TrustedPeople tárolójába. Ez a lépés nem szükséges, ha a kiszolgálótanúsítványt egy ügyfél megbízható kiállítója állítja ki.

  5. A szolgáltatásszámítógép Service.exe.config fájljában módosítsa az alapcím értékét úgy, hogy a localhost helyett egy teljesen minősített számítógépnevet adjon meg.

  6. A szolgáltatás számítógépén futtassa a Service.exe parancsot a parancssorban.

  7. Másolja az ügyfélprogram fájljait a \client\bin\ mappából a nyelvspecifikus mappából az ügyfélszámítógépre.

  8. Az ügyfélszámítógép Client.exe.config fájljában módosítsa a végpont címértékét úgy, hogy az megfeleljen a szolgáltatás új címének.

  9. Az ügyfélszámítógépen indítsa el Client.exe a parancssori ablakból.

  10. Ha az ügyfél és a szolgáltatás nem tud kommunikálni, tekintse meg a WCF minták hibaelhárítási tippeket a éscímsorok alatt.

A minta utáni tisztítás

  1. A minta végrehajtása után futtassa le a mintamappában lévő Cleanup.bat-t.