Megosztás:


Szolgáltatásidentitás-minta

Ez a szolgáltatásidentitás-minta bemutatja, hogyan állíthatja be egy szolgáltatás identitását. Tervezéskor az ügyfél lekérheti az identitást a szolgáltatás metaadataival, majd futásidőben az ügyfél hitelesítheti a szolgáltatás identitását. A szolgáltatásidentitás fogalma az, hogy lehetővé tegye az ügyfél számára a szolgáltatás hitelesítését, mielőtt bármelyik műveletét meghívja, így védve az ügyfelet a hitelesítés nélküli hívásoktól. Biztonságos kapcsolat esetén a szolgáltatás az ügyfél hitelesítő adatait is hitelesíti a hozzáférés engedélyezése előtt, de nem ez a minta a középpontja. Tekintse meg a Client mintákat, amelyek bemutatják a kiszolgálóhitelesítést.

Megjegyzés:

A minta telepítési eljárása és összeállítási utasításai a témakör végén találhatók.

Ez a minta a következő funkciókat mutatja be:

  • Hogyan állíthatja be a különböző identitástípusokat a különböző végpontokon egy szolgáltatáshoz. Minden identitástípus különböző képességekkel rendelkezik. A használandó identitás típusa a végpont kötésén használt biztonsági hitelesítő adatok típusától függ.

  • Az identitás konfigurálásban deklaratív módon vagy kódban is beállítható. Általában az ügyfél és a szolgáltatás esetében is konfigurációval kell beállítania az identitást.

  • Az egyéni identitás beállítása a kliensen. Az egyéni identitás általában egy meglévő identitástípus testreszabása, amely lehetővé teszi, hogy az ügyfél megvizsgálja a szolgáltatás hitelesítő adataiban megadott egyéb jogcímadatokat, hogy engedélyezési döntéseket hozhassanak a szolgáltatás hívása előtt.

    Megjegyzés:

    Ez a minta egy adott, identity.com nevű tanúsítvány identitását és a tanúsítványban található RSA-kulcsot ellenőrzi. Ha a tanúsítvány- és RSA-identitástípusokat az ügyfél konfigurációjában használja, egyszerűen lekérheti ezeket az értékeket, ha megvizsgálja annak a szolgáltatásnak a WSDL-ét, amelyben ezek az értékek szerializálva vannak.

Az alábbi mintakód bemutatja, hogyan konfigurálható egy szolgáltatásvégpont identitása egy tanúsítvány tartománynév-kiszolgálójával (DNS-ével) egy WSHttpBinding használatával.

//Create a service endpoint and set its identity to the certificate's DNS
WSHttpBinding wsAnonbinding = new WSHttpBinding (SecurityMode.Message);
// Client are Anonymous to the service
wsAnonbinding.Security.Message.ClientCredentialType = MessageCredentialType.None;
WServiceEndpoint ep = serviceHost.AddServiceEndpoint(typeof(ICalculator),wsAnonbinding, String.Empty);
EndpointAddress epa = new EndpointAddress(dnsrelativeAddress,EndpointIdentity.CreateDnsIdentity("identity.com"));
ep.Address = epa;

Az identitás a App.config fájl konfigurációjában is megadható. Az alábbi példa bemutatja, hogyan állíthatja be az UPN (felhasználónév) identitást egy szolgáltatásvégponthoz.

<endpoint address="upnidentity"
        behaviorConfiguration=""
        binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_Windows"
        name="WSHttpBinding_ICalculator_Windows"
        contract="Microsoft.ServiceModel.Samples.ICalculator">
  <!-- Set the UPN identity for this endpoint -->
  <identity>
      <userPrincipalName value="host\myservice.com" />
  </identity >
</endpoint>

Egy egyéni identitás az ügyfélen az EndpointIdentity és az IdentityVerifier osztályokból származtatva állítható be. Elméletileg az IdentityVerifier osztály a szolgáltatás AuthorizationManager osztályának ügyfél-oldali megfelelőjeként tekinthető. Az alábbi példakód egy OrgEndpointIdentity implementációt mutat be, amely a szerver tanúsítványának alanynevében egyező szervezetnevet tárol. A szervezet nevének engedélyezési ellenőrzése az CheckAccess osztály metódusában CustomIdentityVerifier történik.

// This custom EndpointIdentity stores an organization name
public class OrgEndpointIdentity : EndpointIdentity
{
    private string orgClaim;
    public OrgEndpointIdentity(string orgName)
    {
        orgClaim = orgName;
    }
    public string OrganizationClaim
    {
        get { return orgClaim; }
        set { orgClaim = value; }
    }
}

//This custom IdentityVerifier uses the supplied OrgEndpointIdentity to
//check that X.509 certificate's distinguished name claim contains
//the organization name e.g. the string value "O=Contoso"
class CustomIdentityVerifier : IdentityVerifier
{
    public override bool CheckAccess(EndpointIdentity identity, AuthorizationContext authContext)
    {
        bool returnvalue = false;
        foreach (ClaimSet claimset in authContext.ClaimSets)
        {
            foreach (Claim claim in claimset)
            {
                if (claim.ClaimType == "http://schemas.microsoft.com/ws/2005/05/identity/claims/x500distinguishedname")
                {
                    X500DistinguishedName name = (X500DistinguishedName)claim.Resource;
                    if (name.Name.Contains(((OrgEndpointIdentity)identity).OrganizationClaim))
                    {
                        Console.WriteLine("Claim Type: {0}",claim.ClaimType);
                        Console.WriteLine("Right: {0}", claim.Right);
                        Console.WriteLine("Resource: {0}",claim.Resource);
                        Console.WriteLine();
                        returnvalue = true;
                    }
                }
            }
        }
        return returnvalue;
    }
}

Ez a minta egy identity.com nevű tanúsítványt használ, amely a nyelvspecifikus identitáskezelési mappában található.

A példa beállítása, elkészítése és futtatá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 C# vagy Visual Basic .NET kiadásának létrehozásához kövesse Windows Communication Foundation-mintákcímű témakör utasításait.

  3. Ha a mintát egy- vagy számítógépközi konfigurációban szeretné futtatni, kövesse a Windows Communication Foundation-minták futtatásával kapcsolatos utasításokat.

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

  1. Windows XP vagy Windows Vista rendszeren importálja az Identity.pfx tanúsítványfájlt az Identity solution mappában a LocalMachine/My (Személyes) tanúsítványtárolóba az MMC beépülő modul eszközzel. Ez a fájl jelszóval védett. Az importálás során a rendszer jelszót kér. Írja be xyz a jelszó mezőbe. További információért tekintse meg a Tanúsítványok megtekintése az MMC beépülő modullal című témakört. Ha ez megtörtént, futtassa a Setup.bat a Visual Studio fejlesztői parancssorában rendszergazdai jogosultságokkal, amely ezt a tanúsítványt a CurrentUser/Trusted People áruházba másolja az ügyfélen való használatra.

  2. Windows Server 2003 rendszeren futtassa a Setup.bat a Visual Studio parancssorában található minta telepítési mappából rendszergazdai jogosultságokkal. 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. Győződjön meg arról, hogy a mintával való munka befejezése után a Cleanup.bat futtatásával eltávolítja a tanúsítványokat. Más biztonsági minták ugyanazokat a tanúsítványokat használják.

  3. Indítsa el a Service.exe a \service\bin könyvtárból. Bizonyosodjon meg róla, hogy a szolgáltatás készen áll, és megjelenik egy üzenet, amely felszólít az <Enter> billentyű lenyomására a szolgáltatás leállításához.

  4. Indítsa el a Client.exe a \client\bin könyvtárból, vagy nyomja le az F5 billentyűt a Visual Studióban a buildeléshez és futtatáshoz. Az ügyféltevékenység megjelenik az ügyfélkonzol-alkalmazásban.

  5. 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. A minta ügyféloldali részének létrehozása előtt mindenképpen módosítsa a szolgáltatás végpontcímének értékét a metódus Client.cs fájljában CallServiceCustomClientIdentity . Ezután hozza létre a mintát.

  2. Hozzon létre egy könyvtárat a szolgáltatásszámítógépen.

  3. Másolja a szolgáltatásprogram fájljait a service\bin fájlból a szolgáltatásszámítógép könyvtárába. Másolja a Setup.bat és Cleanup.bat fájlokat is a szolgáltatásszámítógépre.

  4. Hozzon létre egy könyvtárat az ügyfélszámítógépen az ügyfél bináris fájljaihoz.

  5. Másolja az ügyfélprogram fájljait az ügyfélszámítógép ügyfélkönyvtárába. Másolja a Setup.bat, Cleanup.batés ImportServiceCert.bat fájlokat is az ügyfélbe.

  6. A szolgáltatásban futtassa setup.bat service a Visual Studio fejlesztői parancssorát, amely rendszergazdai jogosultságokkal van megnyitva. A setup.bat argumentummal futtatott service létrehoz egy szolgáltatástanúsítványt a számítógép teljes tartománynevével, és exportálja a szolgáltatástanúsítványt egy Service.cer nevű fájlba.

  7. Másolja a Service.cer fájlt a szolgáltatáskönyvtárból az ügyfélszámítógép ügyfélkönyvtárába.

  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. Több esetet kell módosítani.

  9. Az ügyfélen futtassa a ImportServiceCert.bat egy rendszergazdai jogosultságokkal megnyitott Visual Studio fejlesztői parancssorában. Ez importálja a szolgáltatástanúsítványt a Service.cer fájlból a CurrentUser – TrustedPeople tárolóba.

  10. A szolgáltatásszámítógépen indítsa el a Service.exe-t a parancssorból.

  11. Az ügyfélszámítógépen indítsa el a Client.exe parancssorbó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.

    Megjegyzés:

    Ez a szkript nem távolítja el az ügyfél szolgáltatástanúsítványait, amikor a mintát számítógépeken futtatja. Ha windowsos kommunikációs alap (WCF) mintákat futtat, amelyek tanúsítványokat használnak a számítógépeken, mindenképpen törölje a CurrentUser – TrustedPeople áruházban telepített szolgáltatástanúsítványokat. Ehhez használja a következő parancsot: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> Például: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.