Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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:
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); }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ó
CreateSecurityTokenProviderobjektumokat. 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 azCreateSecurityTokenProvidermetó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); } }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); } }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 -peA 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 TrustedPeopleA 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 -peA 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
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.
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
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.
Indítsa el a Service.exe a service\bin fájlból.
Indítsa el a Client.exe a \client\bin fájlból. Az ügyféltevékenység megjelenik az ügyfélkonzol-alkalmazásban.
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
Hozzon létre egy címtárat a szolgáltatásszámítógépen a szolgáltatás bináris fájljaihoz.
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.
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.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.
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.
A szolgáltatás számítógépén futtassa a Service.exe parancsot a parancssorban.
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.
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.
Az ügyfélszámítógépen indítsa el
Client.exea parancssori ablakból.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
- A minta végrehajtása után futtassa le a mintamappában lévő Cleanup.bat-t.